사용자 정의 사전을 사용하여 엔티티 감지하기

제품 이름이나 조직 목록처럼 탐지하고자 하는 고정된 용어 집합이 있다면, 사전을 생성할 수 있습니다. 사전 매칭은 매우 빠르고 리소스 효율이 높습니다.

Watson 자연어 처리 사전에는 단순한 문자열 일치 기능을 넘어서는 다음과 같은 고급 일치 기능이 포함되어 있습니다:

  • 사전 용어는 ‘바퀴’와 같이 하나의 단어로 구성될 수도 있고, ‘핸들’과 같이 여러 단어로 구성될 수도 있습니다.
  • 사전 용어 일치 검색은 대소문자를 구분하거나 구분하지 않을 수 있습니다. 대소문자를 구분하는 일치 방식을 사용하면, ABS와 같은 약어가 ‘abs ’처럼 다른 의미를 지닌 일반 용어와 일치하지 않도록 할 수 있습니다.
  • 동일한 텍스트에 여러 사전 항목이 일치할 때, 일치 항목을 어떻게 통합할지 지정할 수 있습니다. WatsonWatson 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개를 사용하여 단일 추출 작업을 실행할 수 있습니다.

사전 파일 만들기

먼저 노트북 내에 모듈 디렉터리를 생성하세요. 이 디렉터리는 노트북 파일 시스템 내에 있으며, 사전 파일을 임시로 저장하는 데 사용됩니다.

노트북에 사전 파일을 생성하려면:

  1. 모듈 디렉터리를 생성합니다. 모듈 폴더 이름에는 하이픈을 포함할 수 없으며, 하이픈을 포함하면 오류가 발생하므로 주의하시기 바랍니다.
    import os
    import watson_nlp
    module_folder = "NLP_Dict_Module_1"
    os.makedirs(module_folder, exist_ok=True)
    
  2. 사전 파일을 생성하고, 이를 모듈 디렉터리에 저장하십시오. 외부 목록이나 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 참 / 거짓 사전 속의 용어와 본문 속의 어근을 서로 연결하세요. 사전에는 어근 형태만 수록되어야 합니다. 예를 들어, 텍스트에서 micemouse 모두를 일치시키려면 사전에 를 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}}