2015-01-19 16 views
6

Data una parola di input, voglio determinare se si tratta di un sostantivo o meno (in caso di ambiguità, ad esempio cook può essere un nome o un verbo, la parola deve essere identificata come un nome).Determinare se una parola è un nome o meno

In realtà io uso il tagger POS dallo Stanford Parser (gli ho dato una sola parola come input e estraggo solo il tag POS dal risultato). I risultati sono abbastanza buoni ma ci vuole molto tempo.

C'è un modo (in python, per favore :) per eseguire questa attività più veloce di quello che faccio in realtà?

+1

il parser stanford esegue molte altre cose sull'input (analisi delle dipendenze, analisi della circoscrizione ...), è una perdita di tempo Qui. Inoltre, il tagging POS non è un po 'troppo forte per quello che voglio fare (di solito il tagging POS viene eseguito su un'intera frase, non una singola parola)? – permanganate

risposta

5

Se si desidera semplicemente verificare se una singola parola può essere utilizzata o meno come nome, il modo più rapido potrebbe essere quello di creare un insieme di tutti i nomi e quindi controllare semplicemente la parola per l'appartenenza a quel set.

Per un elenco di tutti i nomi è possibile utilizzare il WordNet corpus (a cui si accede attraverso NLTK per esempio):

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

è una possibilità, grazie :) nltk fornisce 67176 nomi, non ne perdiamo molti (usa un altro dizionario)? (Penso che tu abbia dimenticato un '()' dopo 'name' nel tuo codice) – permanganate

+0

Potresti aver ragione: non sono sicuro di quanti nomi inglesi ci siano! Potresti riuscire a trovare una lista più ampia altrove per espandere ciò che WordNet offre. ('.name', senza le parentesi, sembra essere il modo corretto per accedere alla parola sulla mia versione di Python e NLTK.) –

+0

Credo che' name' sia una funzione, e il codice dovrebbe leggere 'nouns = {x. nome(). split ('.', 1) [0] [...]} ' – Ponkadoodle

1

Non posso parlare per il wrapper Python, ma se si utilizza la Stanford POS tagger anziché il parser, dovrebbe essere molto più veloce. Esistono wrapper per Stanford CoreNLP, che include il tagger: https://pypi.python.org/pypi/corenlp-python; o, sembra che nltk abbia un modulo tagger Stanford anche http://www.nltk.org/_modules/nltk/tag/stanford.html.

È inoltre possibile ottenere risultati migliori se si incorpora la singola parola in una frase giocattolo. Qualcosa come "The X is a thing." A seconda della frase, questo può influenzare o allontanare dall'indovinare anche le parole come nomi.

Problemi correlati