4

2 つのリストがあります。1 つはユーザーの興味です。次に、本に関するキーワードです。与えられた関心リストに基づいて、ユーザーにその本をお勧めしたいと思います。SequenceMatcherPython ライブラリのクラスを使用してdifflib、「ゲーム」、「ゲーム」、「ゲーム」、「ゲーマー」などの類似した単語を照合しています。このratio関数は、2 つの文字列がどの程度類似しているかを示す [0,1] の間の数値を返します。 . しかし、「ループ」と「シューティング」の類似性を計算した 1 つの例に行き詰まりました。であることがわかります0.6667

for interest in self.interests:
    for keyword in keywords:
       s = SequenceMatcher(None,interest,keyword)
       match_freq = s.ratio()
       if match_freq >= self.limit:
            #print interest, keyword, match_freq
            final_score += 1
            break 

Python でこの種のマッチングを実行する他の方法はありますか?

4

3 に答える 3

10

まず、単語には多くの意味があります。似たような単語を見つけようとすると、単語の意味を明確にする必要がある場合がありますhttp://en.wikipedia.org/wiki/Word-sense_disambiguation

単語のペアが与えられた場合、2 つの単語が類似しているかどうかの尺度として最も類似した感覚のペアを使用すると、次のように試すことができます。

from nltk.corpus import wordnet as wn
from itertools import product

wordx, wordy = "cat","dog"
sem1, sem2 = wn.synsets(wordx), wn.synsets(wordy)

maxscore = 0
for i,j in list(product(*[sem1,sem2])):
  score = i.wup_similarity(j) # Wu-Palmer Similarity
  maxscore = score if maxscore < score else maxscore

他にも使用できる類似関数があります。http://nltk.googlecode.com/svn/trunk/doc/howto/wordnet.html . 唯一の問題は、wordnet にない単語に遭遇した場合です。次に、にフォールバックすることをお勧めしますdifflib

于 2013-09-18T12:52:01.447 に答える