2015-11-09 4 views
1

Это происходит, когда есть потенциал NE следует запятая, например, если мои строки являются чем-то вроде,выпуск распознавания НЭ с StanfordNER в питона NLTK

«Эти имена Praveen Kumar ,, Дэвид Харрисон, Пол Харрисон, бла "

или

"Калифорния, США"

Мой вывод выглядит следующим образом.

[[(u'These 'u'O '), (u'names', u'O '), (u'Praveen', u'O'), (u'Kumar ,, ', u'O'), (u'David ', u'PERSON'), (u'Harrison, ', u'O'), (u'Paul ', u'PERSON'), (u'Harrison, 'u'O '), (u'blah', u'O ')]]

или

[[(u'California,', u'O'), (u'United ', u'LOCATION'), (u'States ', u'LOCATION')]]

почему это делает не признать потенциальные сетевые элементы, такие как «Правеен Кумар», «Харрисон» и «Калифорния»?

Вот как это использовать его в коде:

from nltk.tag.stanford import NERTagger 
st = NERTagger('stanford-ner/classifiers/english.all.3class.distsim.crf.ser.gz', 'stanford-ner/stanford-ner.jar') 

tags = st.tag("California, United States".split()) 

Это потому, что я разметить вход stirng с split()? Как я могу это решить, так как он отлично работает при попытке использовать Java?

+1

Во-первых, 'из nltk import word_tokenize', затем' st.tag (word_tokenize («California, United States»)) ' – alvas

ответ

2

Так как вы делаете это через NLTK, использовать его tokenizers разделить ваш вклад :

alltext = myfile.read() 
tokenized_text = nltk.word_tokenize(alltext) 

Edit: Вы, вероятно, лучше с собственной Tokenizer Стэнфордского набора инструментов, в соответствии с рекомендациями другой ответ. Так что, если вы будете кормить жетоны одного из инструментов Stanford, разметить текст так, чтобы получить именно лексемизацию, что инструменты ожидают:

from nltk.tokenize.stanford import StanfordTokenizer 
tokenize = StanfordTokenizer().tokenize 

alltext = myfile.read() 
tokenized_text = tokenize(alltext) 

Чтобы использовать этот метод, вы должны будете иметь Стэнфорд инструменты, и nltk должен быть в состоянии их найти. Я полагаю, вы уже позаботились об этом, так как вы используете инструмент Stanford NER.

+0

должно быть достаточно, чтобы использовать word_tokenize, поскольку оно отправляет_tokenize внутри него? http://www.nltk.org/_modules/nltk/tokenize.html – KillBill

+0

Вы правы! Это было не так, как в версии 2: 'word_tokenize' иногда выдавал разные маркеры на границах предложения, если их вызывают на весь текст. Мне нравится новый дизайн :-) – alexis

1

Эти запятые должны быть отдельными токенами. Просто использование split() не выполняет этого, поэтому тег NER не распознает токен, например «California».

Если вы хотите, чтобы получить аналогичное поведение с помощью Stanford CoreNLP в Java, я предлагаю использовать NLTK обертку для токенизации: http://www.nltk.org/_modules/nltk/tokenize/stanford.html