2013-07-16 18 views

risposta

37

Non penso che sia necessario WordNet per trovare nomi propri, suggerisco di usare il tagger di parte del discorso pos_tag.

Per trovare nomi propri, cercare il NNP tag:

from nltk.tag import pos_tag 

sentence = "Michael Jackson likes to eat at McDonalds" 
tagged_sent = pos_tag(sentence.split()) 
# [('Michael', 'NNP'), ('Jackson', 'NNP'), ('likes', 'VBZ'), ('to', 'TO'), ('eat', 'VB'), ('at', 'IN'), ('McDonalds', 'NNP')] 

propernouns = [word for word,pos in tagged_sent if pos == 'NNP'] 
# ['Michael','Jackson', 'McDonalds'] 

Potrebbe non essere molto soddisfatto dal Michael e Jackson è suddiviso in 2 gettoni, quindi potrebbe essere necessario qualcosa di più complesso come Nome Tagger di entità.

A destra, come documentato dal set di tag penntreebank, per i nomi possessivi, è sufficiente cercare il tag POS, http://www.mozart-oz.org/mogul/doc/lager/brill-tagger/penn.html. Ma spesso il tagger non codifica POS quando è un NNP.

Per trovare Possessive Nomi, cercano str.endswith (" 's ") o str.endswith ("' s"):

from nltk.tag import pos_tag 

sentence = "Michael Jackson took Daniel Jackson's hamburger and Agnes' fries" 
tagged_sent = pos_tag(sentence.split()) 
# [('Michael', 'NNP'), ('Jackson', 'NNP'), ('took', 'VBD'), ('Daniel', 'NNP'), ("Jackson's", 'NNP'), ('hamburger', 'NN'), ('and', 'CC'), ("Agnes'", 'NNP'), ('fries', 'NNS')] 

possessives = [word for word in sentence if word.endswith("'s") or word.endswith("s'")] 
# ["Jackson's", "Agnes'"] 

In alternativa, è possibile utilizzare NLTK ne_chunk ma doesn 't sembrano fare molto altro a meno che non si sono preoccupati per il tipo di nome proprio si ottiene dalla frase:

>>> from nltk.tree import Tree; from nltk.chunk import ne_chunk 
>>> [chunk for chunk in ne_chunk(tagged_sent) if isinstance(chunk, Tree)] 
[Tree('PERSON', [('Michael', 'NNP')]), Tree('PERSON', [('Jackson', 'NNP')]), Tree('PERSON', [('Daniel', 'NNP')])] 
>>> [i[0] for i in list(chain(*[chunk.leaves() for chunk in ne_chunk(tagged_sent) if isinstance(chunk, Tree)]))] 
['Michael', 'Jackson', 'Daniel'] 

Utilizzando ne_chunk è un po' prolisso e non ti fa arrivare i possessivi.

+0

Grazie per questa soluzione, l'ho implementata come script di console lo scorso novembre - https://github.com/dereckson/extract-proper-nouns - e ho importato con successo l'elenco dei nomi propri da un romanzo. – Dereckson

+0

Contento che la risposta aiuti, è bello vedere che hai una soluzione pronta per altre persone che stanno cercando di eseguire la stessa attività =) – alvas

+1

E 'possibile usare nltk per estrarre i nomi propri da qualche testo _strutturato come un file di registro dove appropriato i nomi sono con ** caso misto ** e il testo è ** non completamente grammaticalmente corretto **? Grazie – user2436428

1

Penso che quello che ti serve sia un tagger , un tagger di parte del discorso. Questo strumento assegna un tag di parte del discorso (ad es. Nome proprio, pronome possesive, ecc.) Ad ogni parola in una frase.

NLTK include alcuni tagger: http://nltk.org/book/ch05.html

C'è anche il Stanford Part-Of-Speech Tagger (open source anche prestazioni migliori).