前提・実現したいこと
配列に格納されている各単語間の類似度を計算して
その数値を表示するプログラムを書いています。
前の質問では実現したいことのために、例外処理を行いました。
前の質問
発生している問題・エラーメッセージ
現在は一つの単語(キー)につき、配列に格納されている他の単語との類似度(要素)が全て出力されますが、これを類似度の高い上位2つの要素だけを出力するにはコードをどのように書き換えるべきでしょうか。
例えば、単語'cats'なら、'pigs'と'clocks'だけを出力するということです。
{'cats': {'pigs': 0.125, 'clocks': 0.06666666666666667}, 'pigs': {'cats': 0.125, 'clocks': 0.0625},
該当のソースコード
python
1from nltk.corpus import wordnet as wn 2import itertools 3words = ["cats", "pigs", "clocks", "cloud", "jerry beans", "orange"] 4words_to_synonym = {} 5for word in words: 6 synonyms = wn.synsets(word, lang='eng') 7 if synonyms: 8 words_to_synonym[word] = synonyms[0] 9 10print(words_to_synonym)
出力
{'cats': Synset('cat.n.01'), 'pigs': Synset('hog.n.03'), 'clocks': Synset('redstem_storksbill.n.01'), 'cloud': Synset('cloud.n.01'), 'orange': Synset('orange.n.01')}
Python
1words_matrix = {word: {} for word in words_to_synonym} 2 3it = itertools.product(words_to_synonym.items(), repeat=2) 4for (word_x, synonym_x), (word_y, synonym_y) in it: 5 if word_x is word_y: 6 continue 7 8 deg_similarity = synonym_x.path_similarity(synonym_y) 9 if deg_similarity is not None: 10 words_matrix[word_x][word_y] = deg_similarity 11 12print(words_matrix)
出力(段落は通常の出力よりも見やすく修正してあります)
{'cats': {'pigs': 0.125, 'clocks': 0.06666666666666667, 'cloud': 0.05555555555555555, 'orange': 0.05263157894736842}, 'pigs': {'cats': 0.125, 'clocks': 0.0625, 'cloud': 0.05263157894736842, 'orange': 0.05}, 'clocks': {'cats': 0.06666666666666667, 'pigs': 0.0625, 'cloud': 0.0625, 'orange': 0.058823529411764705}, 'cloud': {'cats': 0.05555555555555555, 'pigs': 0.05263157894736842, 'clocks': 0.0625, 'orange': 0.07692307692307693}, 'orange': {'cats': 0.05263157894736842, 'pigs': 0.05, 'clocks': 0.058823529411764705, 'cloud': 0.07692307692307693}}
補足情報(FW/ツールのバージョンなど)
Python 3.6.3
Mac OS High Sierra
Jupyter notebook 5.0.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/06/28 13:22