Почему большие результаты очень непредсказуемы?

Я пробовал использовать spacy для ner, но результаты очень непредсказуемы. Иногда spacy не распознает конкретную страну. Кто-нибудь может объяснить, почему это происходит? Я пробовал несколько случайных предложений.

ДЕЛО 1:

nlp = spacy.load("en_core_web_sm")
print(nlp)
sent = "hello china hello japan"
doc = nlp(sent)
for i in doc.ents:
  print(i.text," ",i.label_)

ВЫХОД: в этом случае нет вывода.

СЛУЧАЙ 2:

nlp = spacy.load("en_core_web_sm")
print(nlp)
sent = "china is a populous nation in East Asia whose vast landscape encompasses grassland, desert, mountains, lakes, rivers and more than 14,000km of coastline."
doc = nlp(sent)
for i in doc.ents:
  print(i.text," ",i.label_)

ВЫХОД:

<spacy.lang.en.English object at 0x7f2213bde080>
china   GPE
East Asia   LOC
more than 14,000km   QUANTITY

person BALA    schedule 03.11.2019    source источник
comment
Какую языковую модель вы использовали? Не могли бы вы привести пример того, насколько это было непредсказуемо? Не могли бы вы предоставить код, который вы тоже использовали?   -  person Anwarvic    schedule 03.11.2019
comment
Я отредактировал вопрос, проверьте еще раз.   -  person BALA    schedule 03.11.2019


Ответы (3)


Модели естественного языка, такие как spaCy NER, учатся на контекстной структуре предложения (окружающих словах). Это почему? Давайте возьмем слово Anwarvic в качестве примера, которое является новым словом, которого вы раньше не видели, и, вероятно, модель spaCy также не видела его раньше. Давайте посмотрим, как будет действовать модель NER при изменении предложенного предложения:

  • "Я люблю Анварвика"
>>> nlp = spacy.load("en_core_web_sm")
>>> sent = "I love Anwarvic"
>>> doc = nlp(sent)
>>> for i in doc.ents:
...     print(i.text," ",i.label_)
Anwarvic   PERSON
  • "Анварвич гигантский"
>>> nlp = spacy.load("en_core_web_sm")
>>> sent = "Anwarvic is gigantic"
>>> doc = nlp(sent)
>>> for i in doc.ents:
...     print(i.text," ",i.label_)
Anwarvic   ORG
  • «Анварвич потрясающий»
>>> nlp = spacy.load("en_core_web_sm")
>>> sent = "Anwarvic is awesome"
>>> doc = nlp(sent)
>>> for i in doc.ents:
...     print(i.text," ",i.label_)

Как мы видим, извлеченные объекты меняются при изменении контекстной структуры Anwarvic. Итак, в первом предложении глагол love очень распространен среди людей. Вот почему модель spaCy предсказывала это как PERSON. То же самое происходит со вторым предложением, где мы используем gigantic для описания таких организаций, как ORG. В третьем предложении awesome - довольно общее прилагательное, которым можно описать практически все, что угодно. Вот почему модель spaCy NER запуталась.

Примечание

На самом деле, когда я запускал первый предоставленный код на своей машине, он извлекал как china, так и japan следующим образом:

china   GPE
japan   GPE
person Anwarvic    schedule 03.11.2019

NER обычно работает следующим образом: вы позволяете POS-Tagger пометить ваше предложение Метки частей речи, такие как глаголы, прилагательные и имена собственные. Затем NER смотрит на существительные более пристально. POS-Tagger становится тем лучше, чем больше информации для правильной классификации POS-тегов. Это более длинные предложения, грамматически правильные предложения и правильное написание.

Ваш первый пример sent = "hello china hello japan" короткий, без глаголов и т. Д., Что затрудняет классификацию POS-тегов для тегировщика. И еще одна информация отсутствует: страны обычно пишутся заглавными буквами: попробуйте sent = "hello China hello Japan", и все заработает.

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

Я рекомендую вам узнать больше о POS-Tagging, это довольно весело!

person chefhose    schedule 03.11.2019

Первый ответ на ваш вопрос - это контекст, и он уже был передан. Это было бы похоже на другие библиотеки НЛП.

Второй ответ, специфичный для spaCy, - недетерминизм. spaCy использует различные внутренние компоненты, зависящие от случайного начального числа. Как указано в этом сообщении формы, может потребоваться установить семена numpy и cupy как минимум, чтобы получить предсказуемые результаты. Вполне может случиться так, что одна машина выдаст вам другой результат, чем другая машина с тем же кодом.

person demongolem    schedule 10.09.2020