독점 이름 체크

가상 조수를 설계할 때 사용자 메시지의 이름을 검사하는 것은 흔히 볼 수 있는 도전이다.이것은 많은 Rasa 사용자들이 직면하는 임무이다. 이것이 바로 당신이 Rasa forum에서 이 주제에 관한 많은 문제를 찾을 수 있는 이유이다.이것도 많은 사람들이 처음에 생각했던 것보다 더 복잡한 문제다.

문제의 소재


만약 네가 프랑스어로 이름을 식별하고 싶다면, 너는 이것이 어려운 문제라고 생각할 수 있니?
너는 많은 곳에서 프랑스어를 한다는 것을 기억해야 한다.그것은 30여 개국의 공용어인데, 그 중 많은 국가의 공용어도 아랍어이다.

이것은 프랑스어 이름을 검사할 때 시도할 수 있다는 것을 의미한다. detect names with an Arabic origin in a French body of text이것은 이 문제에 새로운 차원을 주었다.
프랑스어를 위한 사전 교육 언어 모델을 고려하고 있다고 가정하십시오.그것은 모든 이름을 찾을 수 있습니까?미리 훈련한 프랑스 모델이 프랑스에서 온 이름에 지나치게 많은 영향을 미칠 수 있다는 것은 일리가 있다.이런 모델은'야크'와'비로니크'같은 이름을 식별하는 데 능숙할 수 있다. 그러나'아딜'이나'하이엘'같은 이름은 프랑스 이외의 곳에서 훈련된 프랑스 모델도 고려할 수 있을까?
이 문제는 프랑스 이외의 지역에만 국한된 것이 아니다.프랑스 내에서도 아랍어에서 이름이 유래되기를 원할 수도 있다.사실 이 문제는 세계적인 현상으로 여겨져야 한다!사용자가 ex-Pat이든 비전통적인 이름이든 모두 그들의 이름을 감지할 수 있어야 합니다.한 사람의 이름을 식별하는 것은 어떤 국가나 언어에도 국한되지 않기 때문에 어려운 문제이다.
이 박문에서 우리는 말 속의 이름을 측정하는 세 가지 방법을 토론할 것이다.이 해결 방안들은 모두 완벽하지는 않지만 가상 조수를 구축할 때 합리적인 출발점을 제공해야 한다.

방법1: 미리 훈련된 언어 모형


미리 훈련된 모델은 100% 완벽하다고 여겨서는 안 된다.그럼에도 불구하고 그것들은 여전히 매우 유용하다.우리는 그들이 이름을 찾을 수 있기를 기대할 수 있기 때문에 미리 훈련된 모형을 완전히 소홀히 해서는 안 된다.
이 작업의 일반적인 구성 요소 중 하나는 SpacyEntityExtractor입니다.다양한 엔티티를 감지하고 지원할 수 있도록 구성할 수 있습니다many languages.특히 Rasa 파이프의 "개인"솔리드를 감지하기 위해 spacy를 구성할 수 있습니다.당신은 아래에서 영어의 설정 예시를 볼 수 있습니다.
pipeline:
- name: SpacyNLP
  model: "en_core_web_md"
- name: SpacyTokenizer
- name: CountVectorsFeaturizer
- name: CountVectorsFeaturizer
  analyzer: char_wb
  min_ngram: 1
  max_ngram: 4
- name: SpacyFeaturizer
  pooling: mean
- name: SpacyEntityExtractor
  dimensions: ["PERSON"]
- name: DIETClassifier
  epochs: 100
구성SpacyEntityExtractor 후 Rasa는 spacy에서 감지된 모든 엔티티를 감지합니다.앞에서 말한 바와 같이 이것은 완벽하지 않지만, 이것은 시작이다.흔히 볼 수 있는 문제는 많은 사람들의 이름이 통상적으로 조직의 이름과 혼동된다는 것이다.또 다른 문제는 스페이스가 최소한 부분적으로 위키백과에서 모델을 훈련시키는 것이지만 위키백과는 사용자가 입력할 수 있는 텍스트를 대표하지 않는다는 것이다.만약 네가 이 문제들을 더욱 상세하게 이해하고 싶다면, 너는 마땅히 우리를 주목해야 한다.

방법2: 명단


만약 네가 사람의 이름을 검사하는 것에 흥미가 있다면, 너는 우리가 기계 학습을 필요로 하는지 알고 싶을 것이다.세계 각지에서 온 아기들의 이름을 포함하는 데이터 집합이 많기 때문에, 이 목록에 기본적인 문자열을 적용해 보십시오.도움을 제공하기 위해서 우리는 이미 rasa-nlu-examples repository(기부를 환영합니다!)에서 그 중의 일부 목록을 수집하기 시작했다.이 이름들은 우리RegexEntityExtractor와 결합하여 말에서 이름을 찾을 수 있다.
작업을 수행하려면 먼저 NLU 데이터에 조회 테이블을 추가해야 합니다.찾기 테이블은 다음과 같이 항목에 별도의 YAML 파일로 추가될 수 있습니다.
nlu:
- lookup: PERSON
  examples: |
    - aafrae
    - aasmae
    - abad
    - ...
    - zoumourrouda
    - zounnoun
찾기 테이블이 정의되면 참조된 파이프에 RegexEntityExtractor를 추가할 수 있습니다.다음 파이프는 spacy와 이름 목록을 동시에 사용하는 예시를 보여 줍니다.
pipeline:
- name: SpacyNLP
  model: "en_core_web_md"
- name: SpacyTokenizer
- name: CountVectorsFeaturizer
- name: CountVectorsFeaturizer
  analyzer: char_wb
  min_ngram: 1
  max_ngram: 4
- name: SpacyFeaturizer
  pooling: mean
- name: SpacyEntityExtractor
  dimensions: ["PERSON"]
- name: RegexEntityExtractor
  case_sensitive: False
  use_lookup_tables: True
- name: DIETClassifier
  epochs: 100
RegexEntityExtractor를 대소문자 구분 없이 설정했습니다.이렇게 하면 대문자를 정확하게 사용하지 않는 사용자에 대한 저항력이 강하지만, 마찬가지로 완벽하지는 않다.'마크'라는 단어는 한 사람의 이름일 수도 있지만, 동사를 가리킬 수도 있다.이름의 맞춤법 오류가 우리의 이름 찾기 테이블에서 그것을 포착할 수 없는 또 다른 원인일 수도 있습니다.

방법 3: 사용자 인터페이스


우리도 사용자의 이름을 검사하는 것이 아니라 직접 사용자에게 물어볼 수 있다.만약 전체 이름을 정확하게 얻어야 한다면, 사용자에게 표 한 장만 작성해 주는 것이 가장 좋다.

표에 대한 더 많은 정보를 읽을 수 있습니다 in our documentation.양식을 만들 때 규칙을 정의하여 대화에서 필요한 정보를 가져오는 방법을 결정할 수 있습니다.예를 들어, 대화에 이름 맞춤법이 정확한지 확인하는 절차를 추가할 수 있습니다.이것은 대화의 추가 동작일 수도 있지만, 그 어떤 기계 학습 모형보다도 정확하다.

이 예시를 어떻게 구축하는지에 관심이 있다면, 반드시 저희 youtube tutorial 를 보십시오.
이런 식으로 표를 사용하는 주요 단점은 사용자가 말을 되풀이하는 데 더 많은 시간을 들여야 한다는 것이다.그러나 이것은 합리적인 균형이다. 왜냐하면 너는 데이터의 질을 더욱 잘 제어할 수 있기 때문이다.

결론: 이것은 여전히 해결되지 않은 문제이다.


우리는 텍스트에서 이름을 찾는 데 일률적인 방법이 없는 것처럼 디지털 보조에 일률적인 해결 방안이 있다고 생각하지 않는다.이렇게 많은 언어, 규범, 사용자들이 있는데, 보통 맞춤형 방법으로 최상의 해결 방안을 찾아야 한다.
이것은 당신의 맞춤형 해결 방안이 매우 복잡하다는 것을 의미하지 않습니다.만약 당신이 이름을 검출하고 있다면, 작지만 심사숙고한 끝에 정의된 폼이 기계 학습에 의존하는 것이 아니라 가장 좋은 해결 방안이 될 것이다.본고에서 우리는 몇 가지 텍스트에서 이름을 추출하는 가장 자주 사용하는 방법을 개술하였으나, 많은 상황에서 이것이 가장 효과적인 간단한 해결 방안이라는 것을 명심하십시오.

좋은 웹페이지 즐겨찾기