Как извлечь из текста ассоциации слов (как прямую, так и обратную)? - PullRequest
0 голосов
/ 22 января 2019

Я использую nltk.collocations, чтобы найти слова в данном тексте, например:

import nltk.collocations
import collections

text = 'I like the customer service. The service personnel were good. So, I would recommend the customer service of XYZ company.'

word_list = []
for sent in nltk.sent_tokenize(text):
    for word in nltk.word_tokenize(sent):
        word_list.append(word)

bgm    = nltk.collocations.BigramAssocMeasures()
finder = nltk.collocations.BigramCollocationFinder.from_words(word_list)
scored = finder.score_ngrams( bgm.likelihood_ratio  )

# Group bigrams by first word in bigram.                                        
prefix_keys = collections.defaultdict(list)
for key, scores in scored:
    prefix_keys[key[0]].append((key[1], scores))

# Sort keyed bigrams by strongest association.                                  
for key in prefix_keys:
    prefix_keys[key].sort(key = lambda x: -x[1])

Затем я могу распечатать слова для данного слова (вместе с его вероятностным соотношением) следующим образом:

print('Words collocated with "customer" are:', prefix_keys['customer'])
>>> Words collocated with "customer" are: [('service', 9.949042176926831)]

print('Words collocated with "service" are:', prefix_keys['service'])
>>> Words collocated with "service" are: [('of', 4.4947649141916255), ('personnel', 4.4947649141916255), ('.', 1.0572102767208427)]

Как видно, service отображается как словосочетание customer, но customer не отображается как словосочетание service. Таким образом, кажется, что когда НЛТК говорит «словосочетания», они действительно означают «слова, которые следуют».

Но коллокация должна подразумевать как прямую, так и обратную коллокации; то есть не должно иметь значения, следует ли customer за service или service за customer, они оба должны быть показаны как расположенные рядом.

Итак, как мне найти реальные словосочетания, а не просто словосочетания, которые следуют за словами?

...