CoreNLP: Может ли он сказать, относится ли существительное к человеку?

Может ли CoreNLP определить, относится ли обычное существительное (в отличие от имени существительного или имени) к человеку "из коробки"? Или, если мне нужно обучить модель для этой задачи, как мне это сделать?

Во-первых, я не ищу разрешение по ключевым словам, а скорее строительный блок для него. Корреляция по определению зависит от контекста, тогда как я пытаюсь оценить, является ли отдельное слово подмножеством "человек" или "человек". Например:

is_human('effort') # False
is_human('dog') # False
is_human('engineer') # True

Моя наивная попытка использовать предварительно обученные векторы слов Генсима и СпаКи не сумела поставить "инженера" выше двух других слов.

import gensim.downloader as api
word_vectors = api.load("glove-wiki-gigaword-100") 
for word in ('effort', 'dog', 'engineer'):
    print(word, word_vectors.similarity(word, 'person'))

# effort 0.42303842
# dog 0.46886832
# engineer 0.32456854

Я нашел следующие списки от CoreNLP многообещающими.

dcoref.demonym                   // The path for a file that includes a list of demonyms 
dcoref.animate                   // The list of animate/inanimate mentions (Ji and Lin, 2009)
dcoref.inanimate 
dcoref.male                      // The list of male/neutral/female mentions (Bergsma and Lin, 2006) 
dcoref.neutral                   // Neutral means a mention that is usually referred by 'it'
dcoref.female 
dcoref.plural                    // The list of plural/singular mentions (Bergsma and Lin, 2006)
dcoref.singular

Будет ли это работать для моей задачи? И если так, как я могу получить к ним доступ из оболочки Python? Спасибо.

1 ответ

Решение

Я бы предложил попробовать WordNet и посмотреть:

  1. если ваши условия покрыты WordNet и
  2. если термины, которые вы хотите, являются гипонимами person.n.01,

Вы должны были бы немного расширить это, чтобы охватить несколько чувств, но суть была бы:

from nltk.corpus import wordnet as wn

# True
wn.synset('person.n.01') in wn.synset('engineer.n.01').lowest_common_hypernyms(wn.synset('person.n.01'))

# False
wn.synset('person.n.01') in wn.synset('dog.n.01').lowest_common_hypernyms(wn.synset('person.n.01'))

Смотрите документы NLTK для lowest_common_hypernym: http://www.nltk.org/howto/wordnet_lch.html

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