質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

解決済

2回答

1429閲覧

pythonにおける例外処理の仕方について

退会済みユーザー

退会済みユーザー

総合スコア0

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2018/06/25 15:04

編集2018/06/26 01:01

前提・実現したいこと

配列に格納されている各単語間の類似度を計算してその数値を表示するプログラムを書いています。
類似度が一定数以上の組み合わせを出力したいです。

発生している問題・エラーメッセージ

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.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

例外処理まで辿り着いているのならググればあふれんばかりの答えがありますが。

python

1try: 2 ~ 3except IndexError: 4 continue

旧式なら

python

1if len(~) < 1: 2 continue

投稿2018/06/25 22:30

編集2018/06/25 22:31
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/06/28 11:21

ご回答いただきましてありがとうございました。
guest

0

ベストアンサー

前以てデータを扱いやすく成形した方が後々楽です。...って前もアドバイスした気がする。

Python

1words_to_synonym = {} 2for word in words: 3 synonyms = wn.synsets(word, lang='eng') 4 if synonyms: 5 words_to_synonym[word] = synonyms[0] 6 7print(words_to_synonym)

このようにキーとして単語を、値として単語に対する第一synsetを持つ辞書を作っておきます。
そして、各要素の直積を知りたいので、itertools.productを使います。

Python

1words_matrix = {word: {} for word in words_to_synonym} 2 3it = 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 > 0: 10 words_matrix[word_x][word_y] = deg_similarity 11 12print(words_matrix)

そしたらこんな感じの結果が出ます。(出力は少し成形しています。)

plain

1{'cats': {'clocks': 0.06666666666666667, 2 'cloud': 0.05555555555555555, 3 'orange': 0.05263157894736842, 4 'pigs': 0.125}, 5 'clocks': {'cats': 0.06666666666666667, 6 'cloud': 0.0625, 7 'orange': 0.058823529411764705, 8 'pigs': 0.0625}, 9 'cloud': {'cats': 0.05555555555555555, 10 'clocks': 0.0625, 11 'orange': 0.07692307692307693, 12 'pigs': 0.05263157894736842}, 13 'orange': {'cats': 0.05263157894736842, 14 'clocks': 0.058823529411764705, 15 'cloud': 0.07692307692307693, 16 'pigs': 0.05}, 17 'pigs': {'cats': 0.125, 18 'clocks': 0.0625, 19 'cloud': 0.05263157894736842, 20 'orange': 0.05}}

投稿2018/06/25 15:18

編集2018/06/25 15:45
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/06/26 00:54

ご回答いただきましてありがとうございます。 前回いただいたご回答では、なぜ第一synsetを持つ辞書が必要なのか十分に理解できていませんでした。 追記でご提案いただいた方法でもエラーになってしまったので、それについて言及します。もし可能でしたら、そちらもアドバイスいただけますと幸いです。
LouiS0616

2018/06/26 05:48

path_similarityがNoneになる条件があるみたいですね。 http://www.nltk.org/howto/wordnet.html https://stackoverflow.com/questions/13555399/nltk-wordnet-similarity-returns-none-for-adjectives これに対してどう対処すべきかは、ちょっとわからんです。 どの単語間でNoneが出るのかいくつか実際に見てみて、関係性が薄そうなのであれば、結果がNoneであるものをプログラム中で切り落とすようにしても良いでしょう。
退会済みユーザー

退会済みユーザー

2018/06/26 12:38

ご回答いただきましてありがとうございます。 if deg_similarity != 'NoneType' and deg_similarity != 'int' and deg_similarity > 0 : では類似度で数値が出るものだけ行列に格納することはできませんよね。
退会済みユーザー

退会済みユーザー

2018/06/26 12:39

if文を修正して実行したところ、依然として以下のエラーが出ました。 '>' not supported between instances of 'NoneType' and 'int'
LouiS0616

2018/06/26 12:41

すみません、やりたいことは分かるのですが、なぜそのような書き方をしたのか理解できません。 それとも私が知らないだけで、 型の名前 と 変数の値 を比較できる言語があるのでしょうか?
退会済みユーザー

退会済みユーザー

2018/06/28 11:21

解決いたしました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問