2017-01-04 8 views

답변

1

이 함수는 토큰이 아닌 공유 된 단어 유형의 비율을 가져옵니다. 당신은 그들의 수에 민감하지 않은 단어 세트를 사용하고 있습니다.

from spacy.attrs import ORTH 

def symm_similarity_types(nlp, textA,textB): 
    docA = nlp.make_doc(textA) 
    docB = nlp.make_doc(textB) 
    countsA = Counter(docA.count_by(ORTH)) 
    countsB = Counter(docB.count_by(ORTH) 
    diff = sum(abs(val) for val in (countsA - countsB).values()) 
    return diff/(len(docA) + len(docB)) 
: 당신이 토큰의 개수, 내가 너무 오래 당신이 어휘 파일 (설치 데이터가있는 경우는, 기본적으로 될 것이다)로드 가지고, 매우 빠른 것으로 다음과 같은 기대하는 원하는 경우

위의 코드와 정확히 같은 것을 계산하려면 여기에 spaCy를 입력하십시오. Doc 개체를 사용하면 Token 개의 개체를 반복 할 수 있습니다. 그런 다음 문자열의 정수 ID 인 token.orth 속성에 기초해야합니다. 당신이 정수의 집합이 아닌 문자열로 작업하기 때문에

def symm_similarity_types(nlp, textA,textB): 
    docA = set(w.orth for w in nlp(textA) 
    docB = set(w.orth for w in nlp(textB) 
    intersection = len(textA.intersection(textB)) 
    difference = len(textA.symmetric_difference(textB)) 
    return intersection/float(intersection+difference) 

이것은, 좀 더 효율적으로 NLTK 버전보다이어야한다 : 나는 정수와 함께 작업하는 문자열의 집합보다 조금 빠를 것으로 예상.

실제로 효율성을 염두에 둔다면 파이썬이 무엇을하고 있는지 추측하는 대신 Cython으로 작업하는 것이 더 편리 할 때가 있습니다. 다음은 기본적인 루프는 다음과 같습니다

# cython: infer_types=True 
for token in doc.c[:doc.length] 
    orth = token.lex.orth 

doc.cTokenC*, 당신은 연속 메모리 반복하고 하나의 포인터를 역 참조하고 있으므로

+0

감사 삼단 논법 (token.lexconst LexemeC*입니다)! 당신은 정확합니다, 나는 말을하고 있었지만, 제 신청서 나 토큰은 잘 작동합니다. 이것은 분명히 나뿐만 아니라 많은 사람들에게 유용 할 것입니다. 당신의 도움을 주셔서 감사합니다! –