Функциональность Stanford Named Entity Recognizer (NER) с NLTK

Возможно ли это: получить (аналогично) функциональность Stanford Named Entity Recognizer, используя только NLTK?

Есть ли пример?

В частности, я заинтересован в извлечении LOCATION части текста. Например, из текста

Собрание состоится 18 ноября по адресу: ул. Вест Вестин 22, Южная Каролина, 12345.

в идеале я хотел бы получить что-то вроде

(S  
22/LOCATION
(LOCATION West/LOCATION Westin/LOCATION)
st./LOCATION
,/,
(South/LOCATION Carolina/LOCATION)
,/,
12345/LOCATION

.....

или просто

22 West Westin st., South Carolina, 12345

Вместо этого я могу только получить

(S
  The/DT
  meeting/NN
  will/MD
  be/VB
  held/VBN
  at/IN
  22/CD
  (LOCATION West/NNP Westin/NNP)
  st./NNP
  ,/,
  (GPE South/NNP Carolina/NNP)
  ,/,
  12345/CD
  on/IN
  Nov.-18/-NONE-)

Обратите внимание, что если я введу свой текст в http://nlp.stanford.edu:8080/ner/process я получу результаты, далекие от совершенства (номер улицы и почтовый индекс по-прежнему отсутствуют), но по крайней мере "st." является частью LOCATION, а Южная Каролина является LOCATION, а не какой-то "GPE / NNP":

Что я делаю не так, пожалуйста? Как я могу исправить это, чтобы использовать NLTK для извлечения части местоположения из некоторого текста, пожалуйста?

Спасибо заранее!

1 ответ

У nltk есть интерфейс для NER Стэнфорда, проверьте nltk.tag.stanford.NERTagger,

from nltk.tag.stanford import NERTagger
st = NERTagger('/usr/share/stanford-ner/classifiers/all.3class.distsim.crf.ser.gz',
               '/usr/share/stanford-ner/stanford-ner.jar') 
st.tag('Rami Eid is studying at Stony Brook University in NY'.split()) 

выход:

[('Rami', 'PERSON'), ('Eid', 'PERSON'), ('is', 'O'), ('studying', 'O'),
('at', 'O'), ('Stony', 'ORGANIZATION'), ('Brook', 'ORGANIZATION'),
('University', 'ORGANIZATION'), ('in', 'O'), ('NY', 'LOCATION')]

Однако каждый раз, когда вы звоните tag nltk просто записывает целевое предложение в файл и запускает инструмент командной строки NER Stanford для синтаксического анализа этого файла и, наконец, анализирует вывод обратно в python. Поэтому издержки загрузки классификаторов (для меня каждый раз около 1 минуты) неизбежны.

Если это проблема, используйте Pyner.

Сначала запустите Stanford NER в качестве сервера

java -mx1000m -cp stanford-ner.jar edu.stanford.nlp.ie.NERServer \
-loadClassifier classifiers/english.all.3class.distsim.crf.ser.gz -port 9191

затем перейдите к pyner папка

import ner
tagger = ner.SocketNER(host='localhost', port=9191)
tagger.get_entities("University of California is located in California, United States")
# {'LOCATION': ['California', 'United States'],
# 'ORGANIZATION': ['University of California']}
tagger.json_entities("Alice went to the Museum of Natural History.")
#'{"ORGANIZATION": ["Museum of Natural History"], "PERSON": ["Alice"]}'

Надеюсь это поможет.

Другие вопросы по тегам