5

私はこれらの2つの関数を使用して類似した単語を検索し、それらは異なるリストを返します。これらの関数は、関連性の高いものから低いものの順に並べ替えられているのでしょうか。

4

1 に答える 1

4

ContextIndex.similar_words(word)各コンテキストでの頻度の積の合計として、各単語の類似度スコアを計算します。 Text.similar()単語が共有する固有のコンテキストの数を単純にカウントします。

similar_words()NLTK 2.0 にバグが含まれているようです。nltk/text.pyの定義を参照してください:

def similar_words(self, word, n=20):
    scores = defaultdict(int)
    for c in self._word_to_contexts[self._key(word)]:
        for w in self._context_to_words[c]:
            if w != word:
                print w, c, self._context_to_words[c][word], self._context_to_words[c][w]
                scores[w] += self._context_to_words[c][word] * self._context_to_words[c][w]
    return sorted(scores, key=scores.get)[:n]

返された単語リストは、類似度スコアの降順で並べ替える必要があります。return ステートメントを次のように置き換えます。

return sorted(scores, key=scores.get)[::-1][:n]

では、おそらくこのバグが原因で、similar()への呼び出しがコメント化されています。similar_words()

def similar(self, word, num=20):
    if '_word_context_index' not in self.__dict__:
        print 'Building word-context index...'
        self._word_context_index = ContextIndex(self.tokens,
                                                filter=lambda x:x.isalpha(),
                                                key=lambda s:s.lower())

#   words = self._word_context_index.similar_words(word, num)

    word = word.lower()
    wci = self._word_context_index._word_to_contexts
    if word in wci.conditions():
        contexts = set(wci[word])
        fd = FreqDist(w for w in wci.conditions() for c in wci[w]
                      if c in contexts and not w == word)
        words = fd.keys()[:num]
        print tokenwrap(words)
    else:
        print "No matches"

注: では、FreqDistとは異なり、ソートされたリストdictkeys()返します。

例:

import nltk

text = nltk.Text(word.lower() for word in nltk.corpus.brown.words())
text.similar('woman')

similar_words = text._word_context_index.similar_words('woman')
print ' '.join(similar_words)

出力:

man day time year car moment world family house boy child country
job state girl place war way case question   # Text.similar()

#man ('a', 'who') 9 39   # output from similar_words(); see following explanation
#girl ('a', 'who') 9 6
#[...]

man number time world fact end year state house way day use part
kind boy matter problem result girl group   # ContextIndex.similar_words()

fdの頻度分布でsimilar()ある は、各単語のコンテキスト数の集計です。

fd = [('man', 52), ('day', 30), ('time', 30), ('year', 28), ('car', 24), ('moment', 24), ('world', 23) ...]

各コンテキストの各単語についてsimilar_words()、頻度の積の合計を計算します。

man ('a', 'who') 9 39  # 'a man who' occurs 39 times in text;
                       # 'a woman who' occurs 9 times
                       # Similarity score for the context is the product:
                       #     score['man'] = 9 * 39
girl ('a', 'who') 9 6
writer ('a', 'who') 9 4
boy ('a', 'who') 9 3
child ('a', 'who') 9 2
dealer ('a', 'who') 9 2
...
man ('a', 'and') 6 11  # score += 6 * 11
...
man ('a', 'he') 4 6    # score += 4 * 6
...
[49 more occurrences of 'man']
于 2013-01-11T23:23:05.407 に答える