Amélioration de l'extraction des noms humains avec nltk

j'essaie d'extraire les noms humains du texte.

quelqu'un aurait-il une méthode qu'ils recommanderaient?

C'est ce que j'ai essayé (code ci-dessous): Je suis à l'aide de nltk pour trouver tout marqué comme une personne et ensuite générer une liste de toutes les parties NNP de cette personne. Je laisse tomber les personnes là où il n'y a qu'un seul NNP qui évite d'avoir un nom de famille Solitaire.

j'obtiens des résultats décents mais je me demandais s'il y avait de meilleures façons de faire la résolution de ce problème.

Code:

import nltk
from nameparser.parser import HumanName

def get_human_names(text):
    tokens = nltk.tokenize.word_tokenize(text)
    pos = nltk.pos_tag(tokens)
    sentt = nltk.ne_chunk(pos, binary = False)
    person_list = []
    person = []
    name = ""
    for subtree in sentt.subtrees(filter=lambda t: t.node == 'PERSON'):
        for leaf in subtree.leaves():
            person.append(leaf[0])
        if len(person) > 1: #avoid grabbing lone surnames
            for part in person:
                name += part + ' '
            if name[:-1] not in person_list:
                person_list.append(name[:-1])
            name = ''
        person = []

    return (person_list)

text = """
Some economists have responded positively to Bitcoin, including 
Francois R. Velde, senior economist of the Federal Reserve in Chicago 
who described it as "an elegant solution to the problem of creating a 
digital currency." In November 2013 Richard Branson announced that 
Virgin Galactic would accept Bitcoin as payment, saying that he had invested 
in Bitcoin and found it "fascinating how a whole new global currency 
has been created", encouraging others to also invest in Bitcoin.
Other economists commenting on Bitcoin have been critical. 
Economist Paul Krugman has suggested that the structure of the currency 
incentivizes hoarding and that its value derives from the expectation that 
others will accept it as payment. Economist Larry Summers has expressed 
a "wait and see" attitude when it comes to Bitcoin. Nick Colas, a market 
strategist for ConvergEx Group, has remarked on the effect of increasing 
use of Bitcoin and its restricted supply, noting, "When incremental 
adoption meets relatively fixed supply, it should be no surprise that 
prices go up. And that’s exactly what is happening to BTC prices."
"""

names = get_human_names(text)
print "LAST, FIRST"
for name in names: 
    last_first = HumanName(name).last + ', ' + HumanName(name).first
        print last_first

Sortie:

LAST, FIRST
Velde, Francois
Branson, Richard
Galactic, Virgin
Krugman, Paul
Summers, Larry
Colas, Nick

mis à part Virgin Galactic, c'est une sortie valide. Bien sûr, savoir que Virgin Galactic n'est pas un nom humain dans le contexte de cet article est la partie dure (peut-être impossible).

33
demandé sur MERose 2013-11-29 21:33:07

7 réponses

Doivent être d'accord avec la suggestion que "faire de mon mieux" n'est pas bien adapté pour ce site, mais je peux vous donner une certaine façon où vous pouvez essayer de creuser dans.

regardez Stanford de Reconnaissance des entités Nommées (TNS). Sa reliure a été incluse dans NLTK v 2.0, mais vous devez télécharger certains fichiers de base. script qui peut faire tout cela pour vous.

j'ai écrit ce script:

import nltk
from nltk.tag.stanford import NERTagger
st = NERTagger('stanford-ner/all.3class.distsim.crf.ser.gz', 'stanford-ner/stanford-ner.jar')
text = """YOUR TEXT GOES HERE"""

for sent in nltk.sent_tokenize(text):
    tokens = nltk.tokenize.word_tokenize(sent)
    tags = st.tag(tokens)
    for tag in tags:
        if tag[1]=='PERSON': print tag

et j'ai reçu pas si mal sortie:

('Francois', 'personne') ("R.", "personne") ('Velde', 'personne') ("Richard", "personne") ("Branson", "personne")) ('Vierge', 'personne') ("Galactique", "personne") ('Bitcoin', 'PERSON') ('Bitcoin', 'PERSON') ("Paul", "Personne") ("Krugman", "personne")) ("Larry", "personne") ('Étés', 'PERSONNE') ('Bitcoin', 'PERSON') ('Pseudo', 'PERSONNE') ('Colas', 'PERSON')

J'espère que c'est utile.

16
répondu troyane 2014-06-09 11:13:20

pour tous ceux qui cherchent, j'ai trouvé cet article utile: http://timmcnamara.co.nz/post/2650550090/extracting-names-with-6-lines-of-python-code

>>> import nltk
>>> def extract_entities(text):
...     for sent in nltk.sent_tokenize(text):
...         for chunk in nltk.ne_chunk(nltk.pos_tag(nltk.word_tokenize(sent))):
...             if hasattr(chunk, 'node'):
...                 print chunk.node, ' '.join(c[0] for c in chunk.leaves())
...
6
répondu Curtis Mattoon 2015-02-25 20:27:17

vous pouvez essayer de faire la résolution des noms trouvés, et vérifier si vous pouvez les trouver dans une base de données telle que freebase.com. Obtenez les données localement et interrogez - les (C'est dans RDF), ou utilisez l'api de google: https://developers.google.com/freebase/v1/getting-started