Извлечение национальностей и стран из текста

Я хочу извлечь все упоминания страны и национальности из текста с помощью nltk. Я использовал теги POS для извлечения всех токенов с меткой GPE, но результаты меня не удовлетворили.

 abstract="Thyroid-associated orbitopathy (TO) is an autoimmune-mediated orbital inflammation that can lead to disfigurement and blindness. Multiple genetic loci have been associated with Graves' disease, but the genetic basis for TO is largely unknown. This study aimed to identify loci associated with TO in individuals with Graves' disease, using a genome-wide association scan (GWAS) for the first time to our knowledge in TO.Genome-wide association scan was performed on pooled DNA from an Australian Caucasian discovery cohort of 265 participants with Graves' disease and TO (cases) and 147 patients with Graves' disease without TO (controls). "

  sent = nltk.tokenize.wordpunct_tokenize(abstract)
  pos_tag = nltk.pos_tag(sent)
  nes = nltk.ne_chunk(pos_tag)
  places = []
  for ne in nes:
      if type(ne) is nltk.tree.Tree:
         if (ne.label() == 'GPE'):
            places.append(u' '.join([i[0] for i in ne.leaves()]))
      if len(places) == 0:
          places.append("N/A")

Полученные результаты:

['Thyroid', 'Australian', 'Caucasian', 'Graves']

Некоторые из них являются национальностями, а другие просто существительными.

Так что же я делаю не так или есть другой способ извлечь такую ​​информацию?


person user6453258    schedule 17.06.2016    source источник
comment
Ничего плохого в том, что ты сделал. Вы выполнили извлечение сущностей, а затем взяли фрагменты сущностей и искали в них метку GPE. Причина, по которой вас не устраивают результаты NLTK, заключается в том, что NLTK обычно имеет низкую производительность в отношении классификации объектов. Существуют таблицы поиска, доступные для GPE. Они довольно полны и очень эффективны. Используйте их вместо того, чтобы полагаться на NLTK.   -  person Ic3fr0g    schedule 21.06.2016
comment
Спасибо, не могли бы вы привести пример этих таблиц поиска...   -  person user6453258    schedule 22.06.2016


Ответы (4)


Итак, после плодотворных комментариев, я углубился в различные инструменты NER, чтобы найти лучшее в распознавании национальностей и упоминаний стран, и обнаружил, что в SPACY есть объект NORP, который эффективно извлекает национальности. https://spacy.io/docs/usage/entity-recognition

person user6453258    schedule 22.06.2016
comment
sPacy фантастический и действительно мощный. Я также рекомендую поиграться с Alchemy API. Хотя для больших данных предпочтительнее использовать sPacy, поскольку он не требует транзакционных издержек для каждого запроса и результата. - person Ic3fr0g; 23.06.2016
comment
Как мы знаем, spacy будет помечать местоположения как {GPE}. В моем случае у меня есть два места, помеченные как GPE (например, Индия, Дели). Теперь моя цель — определить, какой из них является городом, а какой — страной. Пожалуйста, прокомментируйте @Renaud - person Nomiluks; 04.12.2017

Если вы хотите, чтобы названия стран были извлечены, вам нужен тег NER, а не тег POS.

Распознавание именованных объектов (NER) — это подзадача извлечения информации, которая направлена ​​на поиск и классификацию элементов в тексте по заранее определенным категориям, таким как имена людей, организации, местоположения, выражения времени, количества, денежные значения, проценты и т. д. .

Проверьте теггер Stanford NER!

from nltk.tag.stanford import NERTagger
import os
st = NERTagger('../ner-model.ser.gz','../stanford-ner.jar')
tagging = st.tag(text.split()) 
person Aerin    schedule 18.06.2016
comment
Он уже извлек сущность!! Возможно, по незнанию. - person Ic3fr0g; 21.06.2016
comment
Ваш ответ просто дает ему список классифицированных слов. Вы даже не предоставляете ему список GPE. Пожалуйста, отредактируйте свой ответ - person Ic3fr0g; 21.06.2016

Вот география, использующая NLTK для извлечения сущностей. Он хранит все места и местоположения в виде географического справочника. Затем он выполняет поиск в географическом справочнике для получения соответствующих мест и местоположений. Посмотрите документы для получения более подробной информации об использовании -

from geograpy import extraction

e = extraction.Extractor(text="Thyroid-associated orbitopathy (TO) is an autoimmune-
mediated orbital inflammation that can lead to disfigurement and blindness. 
Multiple genetic loci have been associated with Graves' disease, but the genetic 
basis for TO is largely unknown. This study aimed to identify loci associated with 
TO in individuals with Graves' disease, using a genome-wide association scan 
(GWAS) for the first time to our knowledge in TO.Genome-wide association scan was 
performed on pooled DNA from an Australian Caucasian discovery cohort of 265 
participants with Graves' disease and TO (cases) and 147 patients with Graves' 
disease without TO (controls).")

e.find_entities()
print e.places()
person Ic3fr0g    schedule 21.06.2016
comment
На самом деле я пытался установить географию, но потерпел неудачу... вот почему я полагался на файл nltk. - person user6453258; 22.06.2016
comment
Та же проблема со мной, я не мог установить географию :( - person Owais Qureshi; 20.03.2017
comment
Пожалуйста, установите NLTK перед установкой географии, или вы можете сделать pip install geograpy-nltk - person Ic3fr0g; 21.03.2017
comment
Для географии это сработало для меня: stackoverflow. ком/вопросы/31172719/ - person atkat12; 27.03.2017
comment
@OwaisKureshi pip install --upgrade html5lib==1.0b8, а затем установите географию - person vinita; 02.05.2017
comment
старый, но для использования python3 - pip3 install geograpy3 - person ASHu2; 04.11.2019

Вы можете использовать Spacy для NER. Это дает лучшие результаты, чем NLTK.

import spacy

nlp = spacy.load('en_core_web_sm')

doc = nlp(u"Apple is opening its first big office in San Francisco and California.")
print([(ent.text, ent.label_) for ent in doc.ents])
person Amey P Naik    schedule 22.05.2019