Я использую 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
, они оба должны быть показаны как расположенные рядом.
Итак, как мне найти реальные словосочетания, а не просто словосочетания, которые следуют за словами?