2017-12-05 17 views
-1
import re 
import spacy 
import nltk 
from nltk.corpus import stopwords 
stop = stopwords.words('english') 
from nltk.corpus import wordnet 

inputfile = open('file.txt', 'r') 
String= inputfile.read() 
nlp = spacy.load('en_core_web_sm') 

def candidate_name_extractor(input_string, nlp): 
    input_string = str(input_string) 

    doc = nlp(input_string) 
    print(doc) 
    # Extract entities 
    doc_entities = doc.ents 
    #print(doc_entities) 
    # Subset to person type entities 
    doc_persons = filter(lambda x: x.label_ == 'PERSON', doc_entities) 
    doc_persons = filter(lambda x: len(x.text.strip().split()) >= 2, doc_persons) 
    doc_persons = list(map(lambda x: x.text.strip(), doc_persons)) 
    candidate_name = doc_persons[0] 
    return candidate_name 

if __name__ == '__main__': 
    names = candidate_name_extractor(String, nlp) 

print(names) 

이 프로그램을 실행하면 print nlp(input_string)이 정상적으로 작동합니다. 그러나 라인 "doc_entities=doc.ents",왜 함수를 호출 할 때 .ents가 적절한 방법으로 작동하지 않습니다.

  1. 그것은 이름 모바일 및 이메일과 나는 그것에서 이름을 추출 할를 포함하는 상위 세 가지 라인을 제거를 실행할 때.

어디에 문제가 어느 "doc_entities = doc.ents"는 적절한 방법 또는 무엇에 작동하지입니까?

+0

어떻게 우리가 말없이이 디버깅 제안 않는 입력을 문자열 또는'nlp'? – erip

+0

다시 말하지만,'file.txt'가 어떻게 생겼는지 전혀 모르겠습니다. – erip

+0

@erip 그것은 나의 CV의 텍스트 파일이다 –

답변

0

그래서 약간 더 간단하게 예제를 다시 작성 했으므로 나에게 잘 작동합니다. 발생한 문제 중 많은 부분이 중첩 된 필터링 및 문자열 연산과 관련이있을 수 있습니다. 스파이가 이미이 모든 작업을 수행하므로 쉽게 삭제할 수 있습니다.

여기서는 텍스트에있는 엔티티를 반복하고, 엔티티 레이블이 PERSON이고 엔티티가 두 개 이상의 토큰으로 구성되어 있다면 엔티티 텍스트를 개인 이름으로 가정하여 인쇄합니다. doc.ents의 각 항목은 Span 개체이며 길이는 토큰의 길이입니다. 따라서 문자열을 분할 할 필요가 없습니다. 간단히 len(ent)을 사용할 수 있습니다.

nlp = spacy.load('en_core_web_sm') 
doc = nlp(u"John Smith") # or whatever else 

for ent in doc.ents: 
    if ent.label_ == 'PERSON' and len(ent) >= 2: 
     print('The candidate name is: ', ent.text) # do something with the entity 

물론 spaCy의 모델이 해당 이름을 엔티티로 인식하는 경우에만 결과가 반환됩니다. 기본 모델은 범용 뉴스 및 웹 텍스트에 대해 교육되어 있으므로 CV를 처리하는 경우 유스 케이스를 미세 조정하지 않으면 항상 완벽한 결과를 얻을 수있는 것은 아닙니다.

귀하의 질문에 귀하가 전화 번호 또는 이메일 주소로 무엇을하고 싶은지 확실하지 않습니다. 그러나이 모든 정보는 귀하의 doc에서 계속 사용할 수 있습니다. 예를 들어, 당신은 또한 이메일 주소를 추출하고 싶었 가정 해 봅시다,이 작업을 수행하는 가장 쉬운 방법은 토큰에 like_email 속성을 사용하는 것입니다 :

doc = nlp(u"John Smith, [email protected]") 
email_addresses = [token.text for token in doc if token.like_email] 
# ['[email protected]'] 
+0

고맙습니다. 그러나 내가 doc = nlp (u "Jay Pratap Pandey")를 넣었을 때 아무 것도 반환하지 않습니다. –

+0

네, 물론 가능합니다 - 모델은 통계적이며 그들이 인식하는 엔티티는 그들이 훈련받은 데이터에 따라 다릅니다. 따라서 교육 자료에는 "John Smith"와 비슷한 이름이 많이 포함되어있을 수 있지만 "Jay Pratap Pandey"와 비슷한 이름은 충분하지 않으므로 모델은 현재 'PERSON'항목으로 예측하지 않습니다. 엔티티를 수동으로 설정할 수 있습니다 (https://spacy.io/usage/linguistic-features#setting-entities) 또는 [모델 교육 및 업데이트] (https://spacy.io/usage/training)를 살펴보십시오. 응용 프로그램이 인식해야하는 이름과 유사한 예제가 더 많이 있습니다. –