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

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

ただいまの
回答率

90.33%

  • Python

    9290questions

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

  • Jupyter

    298questions

  • 自然言語処理

    138questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 201

tenjin

score 216

 前提・実現したいこと

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

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

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

 該当のソースコード

from nltk.corpus import wordnet as wn

data = ["cats", "pigs", "clocks", "cloud", "jerry beans", "orange"]
words_matrix = {}
for i in range(5):
    row = {}
    for j in range(5):
        simNum = wn.synsets(data[i], lang='eng')[0].path_similarity(wn.synsets(data[j], lang='eng')[0]) 
    if simNum > 0:
        row[data[j]] = simNum
    else:
         pass
    words_matrix[data[i]] = row

for k,v in words_matrix.items():
    print(k, v)

 試したこと

range(4)では以下のように求めたい出力を得ることができました。

from nltk.corpus import wordnet as wn

data = ["cats", "pigs", "clocks", "cloud", "jerry beans", "orange"]]
words_matrix = {}
for i in range(4):
    row = {}
    for j in range(4):
        simNum = wn.synsets(data[i], lang='eng')[0].path_similarity(wn.synsets(data[j], lang='eng')[0]) 
    if simNum > 0:
        row[data[j]] = simNum
    else:
         pass
    words_matrix[data[i]] = row

for k,v in words_matrix.items():
    print(k, v)


出力

cats {'cloud': 0.05555555555555555}
pigs {'cloud': 0.05263157894736842}
clocks {'cloud': 0.0625}
cloud {'cloud': 1.0}

'jerry beans'は類似度計算ができていないのか確認

print(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:


の部分でエラーが出てしまうという問題に直面しています。

#wordsは大規模データ6000単語の配列
import itertools
words_to_synonym = {}
for word in words:
    synonyms = wn.synsets(word, lang='eng')
    if synonyms:
        words_to_synonym[word] = synonyms[0]
print(words_to_synonym)

words_matrix = {word: {} for word in words_to_synonym}
it = itertools.product(words_to_synonym.items(), repeat=2)
for (word_x, synonym_x), (word_y, synonym_y) in it:
    if word_x is word_y:
        continue

    deg_similarity = synonym_x.path_similarity(synonym_y)
    if deg_similarity > 0:
        words_matrix[word_x][word_y] = deg_similarity

print(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.

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

words_to_synonym = {}
for word in words:
    synonyms = wn.synsets(word, lang='eng')
    if synonyms:
        words_to_synonym[word] = synonyms[0]

print(words_to_synonym)

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

words_matrix = {word: {} for word in words_to_synonym}

it = product(words_to_synonym.items(), repeat=2)
for (word_x, synonym_x), (word_y, synonym_y) in it:
    if word_x is word_y:
        continue

    deg_similarity = synonym_x.path_similarity(synonym_y)
    if deg_similarity > 0:
        words_matrix[word_x][word_y] = deg_similarity

print(words_matrix)

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

{'cats': {'clocks': 0.06666666666666667,
          'cloud': 0.05555555555555555,
          'orange': 0.05263157894736842,
          'pigs': 0.125},
 'clocks': {'cats': 0.06666666666666667,
            'cloud': 0.0625,
            'orange': 0.058823529411764705,
            'pigs': 0.0625},
 'cloud': {'cats': 0.05555555555555555,
           'clocks': 0.0625,
           'orange': 0.07692307692307693,
           'pigs': 0.05263157894736842},
 'orange': {'cats': 0.05263157894736842,
            'clocks': 0.058823529411764705,
            'cloud': 0.07692307692307693,
            'pigs': 0.05},
 'pigs': {'cats': 0.125,
          'clocks': 0.0625,
          'cloud': 0.05263157894736842,
          'orange': 0.05}}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/26 09:54

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

    キャンセル

  • 2018/06/26 14: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 21:38

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

    キャンセル

  • 2018/06/26 21:39

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

    キャンセル

  • 2018/06/26 21:41

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

    キャンセル

  • 2018/06/26 21:44 編集

    http://www.nltk.org/howto/wordnet.htmlによると、path_similarityの返り値は
    ・None
    ・0から1までの浮動小数 のいずれかです。

    if deg_similarity is not None: で充分だと思いますが。

    キャンセル

  • 2018/06/28 20:21

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

    キャンセル

+1

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

try:
  ~
except IndexError:
  continue

旧式なら

if len(~) < 1:
  continue

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/28 20:21

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

    キャンセル

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    9290questions

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

  • Jupyter

    298questions

  • 自然言語処理

    138questions

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