НЛТК: как искать связь между некоторыми словами? - PullRequest
0 голосов
/ 11 февраля 2019

Я использую nltk и wordnet, чтобы связать слова, принадлежащие некоторой группе отношений.Например, «парковка» и «здание» должны иметь некоторую родительскую связь.Я использую гипернимки, но для некоторых слов нет соединения.

x = wordnet.synset('parking.n.01')
y = wordnet.synset('building.n.01')

print(x._shortest_hypernym_paths(y))
print(y._shortest_hypernym_paths(x))

{Synset ('parking.n.01'): 0, Synset ('room.n.02'): 1, Synset ('position.n.07'): 2, Synset ('ratio.n.01'): 3, Synset ('abstraction.n.06'): 4, Synset ('entity.n.01'): 5, Synset (' ROOT '): 6} {Synset ('building.n.01'): 0, Synset ('structure.n.01'): 1, Synset ('артефакт.n.01 '): 2, Synset (' whole.n.02 '): 3, Synset (' object.n.01 '): 4, Synset (' Physical_entity.n.01 '): 5, Synset ('entity.n.01 '): 6, Synset (' ROOT '): 7}

Здесь соединение проходит через entity.n.01, который, честно говоря,корень для почти всех физических существительных.Как я могу получить что-то лучше, чем это?

Я бы хотел получить что-то вроде «парковка» -> «конструкция» -> «здание»;это может быть длиннее, но «чужие» слова не должны быть там, как, например, «обезьяна», которая также проникает в сущность.

1 Ответ

0 голосов
/ 12 февраля 2019

Найден полезный способ просмотра возможностей:

def getShortestHypernymPath(word1, word2, nulls=False):
    syns1 = wordnet.synsets(word1)
    syns2 = wordnet.synsets(word2)
    for s1 in syns1:
        for s2 in syns2:
            lch = s2.lowest_common_hypernyms(s1)
            if len(lch) > 0 or nulls:
                print(s1, '<-->', s2, '===', lch)

nlpf.getShortestHypernymPath('parking', 'building', nulls=False)

Возвращает:

Synset ('parking.n.01') <-> Synset ('building.n.01 ') === [Synset (' entity.n.01 ')] Synset (' parking.n.01 ') <-> Synset (' construction.n.01 ') === [Synset('abstraction.n.06')] Synset ('parking.n.01') <-> Synset ('construction.n.07') === [Synset ('abstraction.n.06')] Synset('parking.n.01') <-> Synset ('building.n.04') === [Synset ('abstraction.n.06')] Synset ('parking.n.02') <--> Synset ('building.n.01') === [Synset ('entity.n.01')] Synset ('parking.n.02') <-> Synset ('construction.n.01') === [Synset ('act.n.02')] Synset ('parking.n.02') <-> Synset ('construction.n.07') === [Synset ('act.n.02 ')] Synset (' parking.n.02 ') <-> Synset (' building.n.04 ') === [Synset (' abstraction.n.06 ')] Synset (' park.v.02 ') <-> Synset (' build.v.05 ') === [Synset (' control.v.01 ')]

, поэтому я могу хотя бы посредничать с ним.

...