2017-01-04 2 views
2

für nltk es so etwas wie wäre:Finden der Prozentsatz der Token, die durch zwei Dokumente geteilt mit spacigen

def symm_similarity(textA,textB): 
    textA = set(word_tokenize(textA)) 
    textB = set(word_tokenize(textB))  
    intersection = len(textA.intersection(textB)) 
    difference = len(textA.symmetric_difference(textB)) 
    return intersection/float(intersection+difference) 

Da spacigen schneller ist, im es in spacigen versuchen zu tun, aber die Token-Objekte scheinen nicht um eine schnelle Lösung zu bieten. Irgendwelche Ideen?

Vielen Dank.

Antwort

1

bekommt Ihre Funktion den Prozentsatz der Wortarten geteilt, nicht Token. Du nimmst die Menge der Wörter, ohne ihre Empfindlichkeit zu beachten.

Wenn Sie zählt von Token wollen, erwarte ich, die folgenden sein sehr schnell, so lange, wie Sie das Vokabular-Datei geladen (die es standardmäßig sein wird, wenn Sie die Daten installiert haben):

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)) 

Wenn Sie genau das gleiche wie Ihren Code oben berechnen möchten, hier ist das SpaCy gleichwertig. Das Objekt ermöglicht die Iteration über Token Objekte. Sie sollten dann Ihre Zählungen auf dem token.orth Attribut basieren, welches die Integer-ID der Zeichenfolge ist. Ich erwarte, dass mit ganzen Zahlen arbeitet, wird ein bisschen schneller als Sätze von Saiten sein:

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) 

Dies sollte etwas effizienter als die NLTK Version sein, weil Sie mit Sätzen von ganzen Zahlen arbeiten, keine Strings.

Wenn Sie wirklich um Effizienz besorgt sind, ist es oft bequemer, einfach in Cython zu arbeiten, anstatt zu raten, was Python macht. Hier ist die grundlegende Schleife:

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

doc.c ist ein TokenC*, so dass Sie über zusammenhängenden Speicher sind Iterieren und dereferencing einen einzelnen Zeiger (token.lex ist ein const LexemeC*)

+0

dank Syllogismus! Du hast Recht, ich habe Wörter gemacht, aber für meine Anwendung funktionieren Wörter oder Token gut. Dies wird sicherlich auch für viele andere Menschen nützlich sein. schätze deine Hilfe! –

Verwandte Themen