2015-01-19 16 views
6

Gegeben ein Eingabewort, ich möchte feststellen, ob es ein Nomen ist oder nicht (im Falle der Mehrdeutigkeit, zum Beispiel cook kann ein Substantiv oder ein Verb sein, das Wort muss identifiziert werden als ein Nomen).Bestimmen, ob ein Wort ein Nomen ist oder nicht

Eigentlich verwende ich den POS-Tagger aus dem Stanford-Parser (ich gebe es ein einzelnes Wort als Eingabe, und ich extrahiere nur das POS-Tag aus dem Ergebnis). Die Ergebnisse sind ziemlich gut, aber es dauert sehr lange.

Gibt es einen Weg (in Python, bitte :), um diese Aufgabe schneller als das, was ich eigentlich tue?

+1

Der Stanford-Parser führt eine Menge anderer Dinge auf der Eingabe (Abhängigkeitsanalyse, Wahlkreisanalyse ...), es ist Zeitverschwendung Hier. Außerdem ist das POS-Tagging nicht ein bisschen zu stark für das, was ich tun möchte (normalerweise wird das POS-Tagging für einen ganzen Satz durchgeführt, nicht für ein einzelnes Wort)? – permanganate

Antwort

5

Wenn Sie nur überprüfen möchten, ob ein einzelnes Wort als Substantiv verwendet werden kann, besteht der schnellste Weg darin, eine Menge aller Substantive zu erstellen und dann das Wort auf Mitgliedschaft in dieser Gruppe zu überprüfen.

Eine Liste aller Substantive Sie die WordNet corpus verwenden könnte (die durch NLTK beispielsweise zugegriffen werden kann):

>>> from nltk.corpus import wordnet as wn 
>>> nouns = {x.name().split('.', 1)[0] for x in wn.all_synsets('n')} 
>>> "cook" in nouns 
True 
>>> "and" in nouns 
False 
+0

es ist eine Möglichkeit, danke :) Nltk bietet 67176 Nomen, verlieren wir nicht viele von ihnen (ein anderes Wörterbuch verwenden)? (Ich glaube, du vergisst ein '()' nach 'name' in deinem Code) – permanganate

+0

Du könntest recht haben: Ich bin mir nicht sicher, wie viele englische Substantive es gibt! Sie können möglicherweise eine größere Liste an anderer Stelle finden, um zu erweitern, was WordNet bietet. ('.name', ohne die Klammern, scheint der richtige Weg zu sein, um auf das Wort meiner Version von Python und NLTK zuzugreifen.) –

+0

Ich glaube' name' ist eine Funktion und der Code sollte 'Substantive = {x. name(). split ('.', 1) [0] [...]} ' – Ponkadoodle

1

ich nicht für die Python-Wrapper sprechen kann, aber wenn man die Stanford verwenden POS tagger eher als der Parser sollte es viel schneller sein. Es gibt Wrapper für Stanford CoreNLP, die den Tagger enthalten: https://pypi.python.org/pypi/corenlp-python; oder, es sieht aus wie nltk hat ein Stanford-Tagger-Modul zu http://www.nltk.org/_modules/nltk/tag/stanford.html.

Sie können auch bessere Ergebnisse erzielen, wenn Sie das einzelne Wort in einen Spielzeugsatz einbetten. Etwas wie "Das X ist eine Sache." Je nach Satz kann dies Sie dazu verleiten, Wörter auch als Substantive zu erraten.

Verwandte Themen