前提・実現したいこと
配列に格納されている各単語間の類似度を計算してその数値を表示するプログラムを書いています。
類似度が一定数以上の組み合わせを出力したいです。
発生している問題・エラーメッセージ
range(5)とした場合、以下のエラーが表示されます。
類似度計算で値が出ず、エラーになる単語はスキップして次の単語を処理したいのですが、
コードをどのように修正すべきでしょうか。
--------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-14-9517cb7e12ac> in <module>() 6 row = {} 7 for j in range(5): ----> 8 simNum = wn.synsets(data[i], lang='eng')[0].path_similarity(wn.synsets(data[j], lang='eng')[0]) 9 if simNum > 0: 10 row[data[j]] = simNum IndexError: list index out of range
該当のソースコード
python
1from nltk.corpus import wordnet as wn 2 3data = ["cats", "pigs", "clocks", "cloud", "jerry beans", "orange"] 4words_matrix = {} 5for i in range(5): 6 row = {} 7 for j in range(5): 8 simNum = wn.synsets(data[i], lang='eng')[0].path_similarity(wn.synsets(data[j], lang='eng')[0]) 9 if simNum > 0: 10 row[data[j]] = simNum 11 else: 12 pass 13 words_matrix[data[i]] = row 14 15for k,v in words_matrix.items(): 16 print(k, v)
試したこと
range(4)では以下のように求めたい出力を得ることができました。
python
1from nltk.corpus import wordnet as wn 2 3data = ["cats", "pigs", "clocks", "cloud", "jerry beans", "orange"]] 4words_matrix = {} 5for i in range(4): 6 row = {} 7 for j in range(4): 8 simNum = wn.synsets(data[i], lang='eng')[0].path_similarity(wn.synsets(data[j], lang='eng')[0]) 9 if simNum > 0: 10 row[data[j]] = simNum 11 else: 12 pass 13 words_matrix[data[i]] = row 14 15for k,v in words_matrix.items(): 16 print(k, v)
出力
cats {'cloud': 0.05555555555555555} pigs {'cloud': 0.05263157894736842} clocks {'cloud': 0.0625} cloud {'cloud': 1.0}
'jerry beans'は類似度計算ができていないのか確認
python
1print(wn.synsets('jerry beans', lang='eng')[0].path_similarity(wn.synsets('cats', lang='eng')[0]) )
エラー文
--------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-16-594cc6b85a09> in <module>() ----> 1 print(wn.synsets('jerry beans', lang='eng')[0].path_similarity(wn.synsets('cats', lang='eng')[0]) ) IndexError: list index out of range
ご回答を受けて試したことと問題
wordsを質問の配列ではなく、大規模データ6000単語などにすると読み込まれて
words_to_synonymとしては正しく一覧が表示されるのですが、直積で数値を出す時に
if deg_similarity > 0:
の部分でエラーが出てしまうという問題に直面しています。
python
1#wordsは大規模データ6000単語の配列 2import itertools 3words_to_synonym = {} 4for word in words: 5 synonyms = wn.synsets(word, lang='eng') 6 if synonyms: 7 words_to_synonym[word] = synonyms[0] 8print(words_to_synonym) 9 10words_matrix = {word: {} for word in words_to_synonym} 11it = itertools.product(words_to_synonym.items(), repeat=2) 12for (word_x, synonym_x), (word_y, synonym_y) in it: 13 if word_x is word_y: 14 continue 15 16 deg_similarity = synonym_x.path_similarity(synonym_y) 17 if deg_similarity > 0: 18 words_matrix[word_x][word_y] = deg_similarity 19 20print(words_matrix)
エラー文
TypeError Traceback (most recent call last) <ipython-input-43-182db5f47e02> in <module>() 8 9 deg_similarity = synonym_x.path_similarity(synonym_y) ---> 10 if deg_similarity > 0: 11 words_matrix[word_x][word_y] = deg_similarity 12 TypeError: '>' not supported between instances of 'NoneType' and 'int'
補足情報(FW/ツールのバージョンなど)
Python 3.6.3
Mac OS High Sierra
Jupyter notebook 5.0.
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/06/28 11:21