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

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

ただいまの
回答率

90.50%

  • Python

    8004questions

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

  • Python 3.x

    6417questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Jupyter

    256questions

  • 自然言語処理

    118questions

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

pythonのprint関数におけるエラー

解決済

回答 3

投稿 編集

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

tenjin

score 214

 前提・実現したいこと

Word2Vecを使った単語間の類似度算出をしようとしています。
配列に入っている単語それぞれの類似度を算出します。
Word2Vecに関する参考記事

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

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-c36bec344767> in <module>()
      3 for i in data:
      4     for  j in data:
----> 5         print(data[i] + '-' + data[j] + str(word2vec_model.similarity(data[i], data[j])))

TypeError: list indices must be integers or slices, not str

 該当のソースコード

import gensim
word2vec_model = gensim.models.KeyedVectors.load_word2vec_format('model.vec', binary=False)
data = ['あくび', '寝言', '寝不足', '消しカス', '消しゴム']

for i in data:
    for  j in data:
        simNum = word2vec_model.similarity(data[i], data[j])
        if simNum > 0:
            print(data[i] + '-' + data[j] + str())
        else:
            pass

 試したこと

以下のように配列からデータを取得せずに、類似度計算をしたところ、
vocabraryにない単語が入力された場合にエラーが出たため、
この例外処理も実現したいことのコードで実装する必要があります。
しかし、現状のコードでは例外処理の前にエラーが出ているため、
この部分が正しく動作するかわかっていない状況です。

import gensim
word2vec_model = gensim.models.KeyedVectors.load_word2vec_format('model.vec', binary=False)
import pprint
pprint.pprint(word2vec_model.similarity('あくび', '寝不足'))
pprint.pprint(word2vec_model.similarity('消しカス', '消しゴム'))


出力

0.38836078794177425KeyError: "word '消しカス' not in vocabulary"

ご回答を受けて試したことと問題

ボキャブラリーにない単語の例外処理が現在のコードでは適切に行われておらず、
エラーが表示されてしまいました。

import gensim
word2vec_model = gensim.models.KeyedVectors.load_word2vec_format('model.vec', binary=False)

data = ['あくび', '寝言', '寝不足', '消しカス', '消しゴム']

for i in range (len(data)):
    for  j in range (len(data)):
        simNum = word2vec_model.similarity(data[i], data[j])
        if simNum > 0:
            print(data[i] + '-' + data[j] + str())
        else:
            pass


出力

あくび-あくび1.0
あくび-寝言0.419536248055
あくび-寝不足0.388360787942
KeyError: "word '消しカス' not in vocabulary"

 補足情報(FW/ツールのバージョンなど)

Python 3.6.3
Mac OS High Sierra
Jupyter notebook 5.0.

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+2

TypeError: list indices must be integers or slices, not str

超が付くほどの基礎です。改めてfor文の書き方をご確認ください。

>>> data = ['a', 'b', 'c']
>>>
>>> for datum in data:
...     print(datum)
...
a
b
c
>>>
>>> for datum in data:
...     print(data[datum])
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: list indices must be integers or slices, not str
>>>
>>> for i in range(len(data)):
...     print(data[i])
...
a
b
c

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/29 08:38

    ご回答いただきましてありがとうございました。
    基本的な文法の学習も疎かにしないよう、気をつけます。
    print関数におけるエラーがなくなったことで、やはりボキャブラリーにない単語でエラーが起き、うまく例外処理ができていないことが明らかになりました。ご回答を受けて試したことに追記させていただきましたので、可能であればこちらもアドバイスをいただけますと幸いです。

    キャンセル

  • 2018/06/29 14:55

    ボキャブラリーにない単語を前もって削除できるのが理想的ですが、ドキュメントhttps://radimrehurek.com/gensim/models/keyedvectors.html#gensim.models.keyedvectors.BaseKeyedVectorsを見る限りまさにこれ!というメソッドはないですね。ひょっとしたらget_vectorの結果を利用できるかもしれませんが、手元で試していないためわかりません。

    hayataka2049さんの回答のように、例外を用いるのも一つの方法ではあります。

    キャンセル

  • 2018/07/01 13:42

    ご回答とご丁寧にご説明いただきましてありがとうございました。

    キャンセル

+2

ボキャブラリに単語がはいっているかどうかは、__contains__で判断できるはずです。

if word2vec_model.__contains__(word1) and word2vec_model.__contains__(word2):
    simNum = word2vec_model.similarity(word1, word2)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/29 15:18

    それが通るなら、in演算子が使えるのでそっちで書けますね
    word1 in word2vec_model and word2 in word2vec_model
    そういえば辞書ライクなオブジェクトになってた記憶が・・・

    キャンセル

  • 2018/06/29 15:21

    なるほど。帰属演算をサポートしているのですか。
    ということは、こんな感じにも書けそうですね。

    data = ['あくび', '寝言', '寝不足', '消しカス', '消しゴム']
    it = filter(lambda w: w in word2vec_model, data)
    for word1, word2 in itertools.product(it, repeat=2):
      if word1 is word2:
        continue

      simNum = word2vec_model.similarity(word1, word2)

    註:成形のため全角空白を用いています。

    キャンセル

  • 2018/07/01 13:41

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

    キャンセル

+1

for word1 in data:
    for  word2 in data:
        try:
            simNum = word2vec_model.similarity(word1, word2)
            print(word1 + '-' + word2 + str(simNum))
        except Exception as e:
            print(e)            

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/01 13:41

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

    キャンセル

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

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

関連した質問

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

  • Python

    8004questions

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

  • Python 3.x

    6417questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Jupyter

    256questions

  • 自然言語処理

    118questions

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