사용자 정의 사전을 사용하여 엔티티 감지하기
제품 이름이나 조직 목록처럼 탐지하고자 하는 고정된 용어 집합이 있다면, 사전을 생성할 수 있습니다. 사전 매칭은 매우 빠르고 리소스 효율이 높습니다.
Watson 자연어 처리 사전에는 단순한 문자열 일치 기능을 넘어서는 다음과 같은 고급 일치 기능이 포함되어 있습니다:
- 사전 용어는 ‘바퀴’와 같이 하나의 단어로 구성될 수도 있고, ‘핸들’과 같이 여러 단어로 구성될 수도 있습니다.
- 사전 용어 일치 검색은 대소문자를 구분하거나 구분하지 않을 수 있습니다. 대소문자를 구분하는 일치 방식을 사용하면, ABS와 같은 약어가 ‘abs ’처럼 다른 의미를 지닌 일반 용어와 일치하지 않도록 할 수 있습니다.
- 동일한 텍스트에 여러 사전 항목이 일치할 때, 일치 항목을 어떻게 통합할지 지정할 수 있습니다. Watson 와 Watson Natural Language Processing이라는 두 가지 사전 항목을 고려할 때, "I like Watson Natural Language Processing"이라는 문장에서 어떤 항목과 일치시킬지 설정할 수 있습니다. 즉, Watson 를 포함하고 있으므로 Watson Natural Language Processing만 일치시키거나, 두 항목 모두 일치시킬 수 있습니다.
- 모든 변형형을 일일이 열거하는 대신, 어근과 일치하도록 지정할 수 있습니다. 이렇게 하면, ‘mouse’라는 단일 사전 항목으로 텍스트 내의 ‘mouse ’와 ‘mice’를 모두 감지할 수 있습니다.
- 각 사전 항목에 ‘조직 카테고리 ’와 같은 라벨을 지정하여 일치 검색 결과에 추가 메타데이터를 포함시킬 수 있습니다.
이러한 모든 기능은 설정할 수 있으므로, 사용 환경에 맞는 옵션을 선택할 수 있습니다.
사전 파일의 종류
Watson 자연어 처리(NLP)는 두 가지 유형의 사전 파일을 지원합니다:
어휘 목록 (로 끝나는
.dict)용어 목록 예시:
Arthur Allen Albert Alexa표 (로 끝나는
.csv)표의 예시:
"label", "entry" "ORGANIZATION", "NASA" "COUNTRY", "USA" "ACTOR", "Christian Bale"
동일한 추출 작업 중에 여러 개의 사전을 사용할 수 있습니다. 두 가지 유형을 동시에 사용할 수도 있습니다. 예를 들어, 사전 3개, 용어 목록 1개, 테이블 2개를 사용하여 단일 추출 작업을 실행할 수 있습니다.
사전 파일 만들기
먼저 노트북 내에 모듈 디렉터리를 생성하세요. 이 디렉터리는 노트북 파일 시스템 내에 있으며, 사전 파일을 임시로 저장하는 데 사용됩니다.
노트북에 사전 파일을 생성하려면:
- 모듈 디렉터리를 생성합니다. 모듈 폴더 이름에는 하이픈을 포함할 수 없으며, 하이픈을 포함하면 오류가 발생하므로 주의하시기 바랍니다.
import os import watson_nlp module_folder = "NLP_Dict_Module_1" os.makedirs(module_folder, exist_ok=True) - 사전 파일을 생성하고, 이를 모듈 디렉터리에 저장하십시오. 외부 목록이나 CSV 파일을 불러올 수도 있고, 다음과 같이 사전 파일을 직접 생성할 수도 있습니다:
# Create a term list dictionary term_file = "names.dict" with open(os.path.join(module_folder, term_file), 'w') as dictionary: dictionary.write('Bruce') dictionary.write('\n') dictionary.write('Peter') dictionary.write('\n') # Create a table dictionary table_file = 'Places.csv' with open(os.path.join(module_folder, table_file), 'w') as places: places.write("\"label\", \"entry\"") places.write("\n") places.write("\"SIGHT\", \"Times Square\"") places.write("\n") places.write("\"PLACE\", \"5th Avenue\"") places.write("\n")
사전 불러오기 및 일치 옵션 설정
다음 헬퍼 메서드를 사용하여 사전을 불러올 수 있습니다.
- 단일 사전을 불러오려면 다음을 사용하십시오.
watson_nlp.toolkit.rule_utils.DictionaryConfig (<dictionary configuration>) - 여러 사전을 불러오려면 다음을 사용하세요
watson_nlp.toolkit.rule_utils.DictionaryConfig.load_all([<dictionary configuration>)])
각 사전마다 사전 구성을 지정해야 합니다. 사전 구성은 Python 사전이며, 다음과 같은 속성을 가집니다:
| 속성 | 값 | 설명 | 필수 |
|---|---|---|---|
name |
문자열 | 사전의 이름 | 예 |
source |
문자열 | 사전 경로(다음 경로를 기준으로 한 상대 경로) module_folder |
예 |
dict_type |
파일 또는 테이블 | 사전 아티팩트가 용어 목록(파일)인지, 아니면 매핑 테이블(테이블)인지 | 아니오. 기본값은 파일입니다 |
consolidate |
ContainedWithin (가장 긴 일치 항목만 유지하고 중복 제거) / NotContainedWithin (가장 짧은 일치 항목만 유지하고 중복 제거) / ContainsButNotEqual (가장 긴 일치 항목만 유지하되 중복 항목도 함께 유지) / ExactMatch (중복 제거) / LeftToRight (가장 왼쪽에 위치한, 서로 겹치지 않는 가장 긴 구간만 유지) | 중복되는 사전 일치 항목은 어떻게 처리해야 할까요? | 아니오. 기본 설정은 일치 항목을 병합하지 않는 것입니다. |
case |
대소문자 구분 / 대소문자 구분 없음 | 대소문자를 구분하거나 구분하지 않도록 설정합니다. | 아니오. 기본값은 완전 일치입니다. |
lemma |
참 / 거짓 | 사전 속의 용어와 본문 속의 어근을 서로 연결하세요. 사전에는 어근 형태만 수록되어야 합니다. 예를 들어, 텍스트에서 mice 와 mouse 모두를 일치시키려면 사전에 를 mouse 추가하세요. 사전에 mice 추가하지 마십시오. 텍스트 내에서 여러 토큰으로 구성된 용어를 일치시키려면, 사전에 해당 용어의 어근을 공백 문자로 구분하십시오. |
아니오. 기본값은 false입니다. |
mappings.columns (열 as attribute of 매핑: {}) |
목록 [ 문자열 ] | CSV 테이블에 표시된 순서대로 정렬된 열 머리글 목록 | 네, 만약 dict_type: table |
mappings.entry (항목 as attribute of 매핑: {}) |
문자열 | 문서와 일치시킬 문자열이 포함된 열 머리글의 이름. | 네, 만약 dict_type: table |
label |
문자열 | 성냥에 붙일 라벨. | 아니오 |
코드 샘플
사용 중인 환경에 따라 코드 예제를 선택하세요:
Watson 자연어 처리 라이브러리가 포함된 환경에서는 다음을 사용합니다:
# Load the dictionaries # Use the following helper method dictionaries = watson_nlp.toolkit.rule_utils.DictionaryConfig.load_all([{ 'name': 'Names', 'source': term_file, 'case':'insensitive' }, { 'name': 'places_and_sights_mappings', 'source': table_file, 'dict_type': 'table', 'mappings': { 'columns': ['label', 'entry'], 'entry': 'entry' } }])
사전을 포함하는 모델 훈련하기
사전을 불러온 후, 사전 모델을 생성하고 RBR.train() 메서드를 사용하여 모델을 학습시킵니다. 이 메서드에서 다음을 지정하십시오:
- 모듈 디렉터리
- 사전 항목의 언어
- 사용할 사전
코드 샘플
custom_dict_block = watson_nlp.resources.feature_extractor.RBR.train(module_folder,
language='en', dictionaries=dictionaries)
새로운 데이터에 모델 적용하기
사전 훈련을 마친 후에는 기존 사전 훈련된 블록을 사용할 때와 마찬가지로 run() 메서드를 사용하여 새로운 데이터에 모델을 적용하십시오.
코드 샘플
custom_dict_block.run('Bruce is at Times Square')
코드 예제의 출력 결과:
{(0, 5): ['Names'], (12, 24): ['SIGHT']}
사전의 레이블이나 이름을 표시하려면:
RBR_result = custom_dict_block.executor.get_raw_response('Bruce is at Times Square', language='en')
print(RBR_result)
라벨이 표시된 출력 결과:
{'annotations': {'View_Names': [{'label': 'Names', 'match': {'location': {'begin': 0, 'end': 5}, 'text': 'Bruce'}}], 'View_places_and_sights_mappings': [{'label': 'SIGHT', 'match': {'location': {'begin': 12, 'end': 24}, 'text': 'Times Square'}}]}, 'instrumentationInfo': {'annotator': {'version': '1.0', 'key': 'Text match extractor for NLP_Dict_Module_1'}, 'runningTimeMS': 3, 'documentSizeChars': 32, 'numAnnotationsTotal': 2, 'numAnnotationsPerType': [{'annotationType': 'View_Names', 'numAnnotations': 1}, {'annotationType': 'View_places_and_sights_mappings', 'numAnnotations': 1}], 'interrupted': False, 'success': True}}