NLP: Was sind einige beliebte Pakete für die Tokenisierung mit mehreren Wörtern?

7

Ich beabsichtige, eine Reihe von Stellenbeschreibungstexten zu kennzeichnen. Ich habe die Standard-Tokenisierung mit Leerzeichen als Trennzeichen versucht. Ich habe jedoch festgestellt, dass es einige Mehrwortausdrücke gibt, die durch Leerzeichen geteilt werden, was bei der nachfolgenden Verarbeitung zu Genauigkeitsproblemen führen kann. Deshalb möchte ich die interessantesten / informativsten Kollokationen in diesen Texten erhalten.

Gibt es gute Pakete für die Tokenisierung mehrerer Wörter, unabhängig von der jeweiligen Programmiersprache? Zum Beispiel "Er studiert Informationstechnologie" ===> "Er" "studiert" "Informationstechnologie".

Ich habe festgestellt, dass NLTK (Python) einige verwandte Funktionen hat.

Was ist der Unterschied zwischen diesen beiden?

Die MWETokenizer-Klasse im Modul nltk.tokenize.mwe scheint auf mein Ziel hinzuarbeiten. MWETokenizer scheint jedoch zu verlangen, dass ich seine Konstruktionsmethode und die .add_mwe-Methode verwende, um Ausdrücke mit mehreren Wörtern hinzuzufügen. Gibt es eine Möglichkeit, ein externes Lexikon mit mehreren Wörtern zu verwenden, um dies zu erreichen? Wenn ja, gibt es ein Mehrwortlexikon?

Vielen Dank!

Tyler 傲 来 国 主
quelle

Antworten:

2

Der Mehrwort-Tokenizer 'nltk.tokenize.mwe' führt im Wesentlichen eine Zeichenfolge zusammen, die bereits in Token unterteilt ist, basierend auf einem Lexikon, wie ich es aus der API-Dokumentation verstanden habe.

Eine Sache, die Sie tun können, ist, alle Wörter mit dem zugehörigen PoS-Tag (Part-of-Speech) zu versehen und zu kennzeichnen und dann reguläre Ausdrücke basierend auf den PoS-Tags zu definieren, um interessante Schlüsselphrasen zu extrahieren.

Zum Beispiel ein Beispiel aus dem NLTK-Buch Kapitel 7 und diesem Blog-Beitrag :

def extract_phrases(my_tree, phrase):
   my_phrases = []
   if my_tree.label() == phrase:
      my_phrases.append(my_tree.copy(True))

   for child in my_tree:
       if type(child) is nltk.Tree:
            list_of_phrases = extract_phrases(child, phrase)
            if len(list_of_phrases) > 0:
                my_phrases.extend(list_of_phrases)

    return my_phrases



def main():
    sentences = ["The little yellow dog barked at the cat",
                 "He studies Information Technology"]

    grammar = "NP: {<DT>?<JJ>*<NN>|<NNP>*}"
    cp = nltk.RegexpParser(grammar)

    for x in sentences:
        sentence = pos_tag(tokenize.word_tokenize(x))
        tree = cp.parse(sentence)
        print "\nNoun phrases:"
        list_of_noun_phrases = extract_phrases(tree, 'NP')
        for phrase in list_of_noun_phrases:
            print phrase, "_".join([x[0] for x in phrase.leaves()])

Sie haben eine Grammatik basierend auf Regex über PoS-Tags definiert:

grammar = "NP: {<DT>?<JJ>*<NN>|<NNP>*}"
cp = nltk.RegexpParser(grammar)

Dann haben Sie es auf einen tokenisierten und markierten Satz angewendet und einen Baum generiert:

sentence = pos_tag(tokenize.word_tokenize(x))
tree = cp.parse(sentence)

Anschließend extract_phrases(my_tree, phrase)analysieren Sie den Baum rekursiv und extrahieren als NP bezeichnete Unterbäume. Das obige Beispiel würde die folgenden Nominalphrasen extrahieren:

Noun phrases:
(NP The/DT little/JJ yellow/JJ dog/NN) The_little_yellow_dog
(NP the/DT cat/NN) the_cat

Noun phrases:
(NP Information/NNP Technology/NNP) Information_Technology

Es gibt einen großartigen Blog-Beitrag von Burton DeWilde über viele weitere Möglichkeiten, interessante Schlüsselwörter zu extrahieren: Einführung in die automatische Schlüsselwortextraktion

David Batista
quelle
1

Der Tokenisierungsprozess sollte nicht geändert werden, auch wenn Sie an mehreren Wörtern interessiert sind. Immerhin sind die Wörter immer noch die Grundmarken. Was Sie tun sollten, um einen Weg zu finden, die richtigen Wörter zu einem Begriff zu kombinieren.

Ein einfacher Weg, dies zu tun, besteht darin, nach einem Begriff zu suchen, bei dem die Wahrscheinlichkeit des Begriffs höher ist als die der unabhängigen Token. Zum Beispiel P ("Weißes Haus")> P ("Weißes") * P ("Haus") Die Auswahl der richtigen Werte für Bedarfsaufzug, Anzahl der Vorkommen und Begriffsklassifizierung kann abgeleitet werden, wenn Sie einen Datensatz von Begriffen aus der Domäne haben . Wenn Sie keine solche Domain haben, müssen mindestens 10 Vorkommen erforderlich sein, und ein Lift von mindestens 2 (normalerweise ist er viel höher, da jede Token-Wahrscheinlichkeit gering ist) funktioniert recht gut.

In Ihrem Fall können Sie auch Begriffe extrahieren, indem Sie für Ihre Domäne relevante Kontexte kombinieren (z. B. "studiertes X", "geübtes Y").

Auch hier können Sie komplexe und elegante Modelle erstellen. In der Regel ist es jedoch von großem Vorteil, nach den wenigen nächsten Wörtern nach den Kontextindikatoren zu suchen.

DaL
quelle
1

Für Ihr Problem denke ich, dass Gensim sehr nützlich sein kann. Was mit der Gensim-Bibliothek implementiert werden kann, ist die Phrasenerkennung. Es ähnelt n-Gramm, aber anstatt das gesamte n-Gramm durch Schieben des Fensters zu erhalten, erkennt es häufig verwendete Phrasen und klebt sie zusammen. Es geht statistisch durch den Textkorpus und identifiziert die häufigsten nebeneinander vorkommenden Wörter.
Im Folgenden wird beschrieben, wie die am besten geeigneten Token mit mehreren Wörtern berechnet werden. Geben Sie hier die Bildbeschreibung ein

Es folgt der Code, um ihn zu verwenden. Es berechnet die zwei Wort-Token.

from gensim.models.phrases import Phrases, Phraser

tokenized_train = [t.split() for t in x_train]
phrases = Phrases(tokenized_train)
bigram = Phraser(phrases)

und so würden Sie es verwenden

Geben Sie hier die Bildbeschreibung ein

Beachten Sie das Wort "new_york", das verkettet ist, da im Korpus statistische Beweise dafür, dass sowohl "new" als auch "york" Wörter zusammenkommen, signifikant waren.

Darüber hinaus können Sie für nicht nur Bi-Gramm bis zu n-Gramm gehen. Hier ist der Artikel, der es im Detail erklärt.

Qaisar Rajput
quelle
0

Diese Erweiterung von Stanford CoreNLP zur Erfassung von MultiWord Expressions (MWEs) war für eine meiner Aufgaben ein Zauber. Bereiten Sie sich für Python-Benutzer darauf vor, Connector-Code zu schreiben oder den Java-Code zu hacken.

yottabytt
quelle
0

Verwenden Sie die Stanford CoreNLP- Bibliothek für die Tokenisierung mehrerer Wörter. Ich habe es gefunden, als ich an einer ähnlichen Aufgabe gearbeitet habe und es hat ziemlich gut funktioniert!

Aktualisiert: Sie können die Stanford CoreNLP-Pipeline verwenden, die ein Tokenisierungsmodell mit mehreren Wörtern enthält. Link Demo für neuronale Netze mit eigenen Daten Ausbildung ist hier

Kein Mann
quelle
Vielleicht könnten Sie auch einen kleinen Codeausschnitt hinzufügen, damit das OP weiß, wie es verwendet wird.
Tasos
Ja, aber detaillierte Informationen zur Verwendung und zum Trainieren mit eigenen Daten finden Sie unter dem genannten Link. Ich habe auch einen speziellen Link hinzugefügt, der eine Demo für das Training ihres Modells für die Mehrwort-Tokenisierung bietet
Noman,
Es ist üblich, dass Verknüpfungsantworten aus verschiedenen Gründen vermieden werden sollten. Beispielsweise kann sich der Inhalt der Seite ändern oder der Link ist in Zukunft nicht mehr erreichbar. Wenn ein neuer Benutzer diese Seite besucht, sollte er in der Lage sein, die vom OP angeforderten Informationen abzurufen. Genauso wie Best Practice.
Tasos
Oh, jetzt verstehe ich es, danke für den Hinweis. Ich werde versuchen, meinen Code für die Verwendung des CoreNLP-MWT-Modells zu finden, oder ich werde ihn erneut codieren und hier (in ein paar Tagen) einfügen, um Informationen der Community zu erhalten!
Noman