前提・実現したいこと
Pythonで単語が1列に書いてあるcsvファイルを読み込み、
各単語間の類似度を計算してその数値を表示するプログラムを書いています。
類似度が一定数以上の組み合わせを出力したいです。
sample.csv
りんご いぬ いちご くま みかん ねこ
出力したい結果(数値は仮)
りんご - いちご 0.3 ...
発生している問題・エラーメッセージ
指定の行の単語を取得する部分でエラーが発生している様です。
AttributeError Traceback (most recent call last) <ipython-input-29-efd3787e995d> in <module>() 4 for i in range(0, len(lines)-2): 5 for j in range(1, len(lines)-1): ----> 6 similarity = wn.synsets(f.iloc[i], lang='jpn')[0].path_similarity(wn.synsets(f.iloc[j], lang='jpn')[0]) 7 if similarity > 0.3: 8 print( f.iloc[i] + '-' +f.iloc[j] + similarity) AttributeError: '_io.TextIOWrapper' object has no attribute 'iloc'
該当のソースコード
python
1#csv読み込み 2import csv 3f = open("sample.csv", encoding='utf-8' ) 4lines = f.readlines() 5 6#行の長さを確認する 7import pandas as pd 8import numpy as np 9print(len(lines)) 10 11#1行目からlen(lines)、2行目からlen(lines)まで最終行まで比較を繰り返す 12from nltk.corpus import wordnet as wn 13for i in range(0, len(lines)-2): 14 for j in range(1, len(lines)-1): 15 similarity = wn.synsets(f.iloc[i], lang='jpn')[0].path_similarity(wn.synsets(f.iloc[j], lang='jpn')[0]) 16 if similarity > 0.3: #類似度0.3以上の組み合わせと数値を出力 17 print( f.iloc[i] + '-' +f.iloc[j] + similarity)
試したこと
WordNetを用いた類似度計算はこのようにできています。
この'人間'や'サル'の部分をcsvファイルから読み込んだデータに変換して計算したいです。
python
1>>> from nltk.corpus import wordnet as wn 2>>> wn.synsets('人間', lang='jpn')[0].path_similarity(wn.synsets('サル', lang='jpn')[0]) 30.1111111111111111
###ご回答を受けて修正・新たな問題
Python
1import csv 2f = open("sample.csv", encoding='utf-8' ) 3lines = f.readlines() 4 5#行の長さを確認する 6import pandas as pd 7import numpy as np 8print(len(lines)) 9 10dataset1 = pd.read_csv("sample.csv") 11dataset1 12 13#1行目からlen(lines)まで比較、2行目からlen(lines)まで比較を繰り返す 14from nltk.corpus import wordnet as wn 15for i in range(0, len(lines)-2): 16 for j in range(1, len(lines)-1): 17 similarity = wn.synsets(lines[i], lang='eng')[0].path_similarity(wn.synsets(lines[j], lang='eng')[0]) 18 if similarity > 0.3: 19 print( lines[i] + '-' + lines[j] + similarity)
問題①
エラー文
以下のエラー文が新たに出力され、
IndexError: list index out of range
という意味が理解できず、修正方法がわかりません。
IndexError Traceback (most recent call last) <ipython-input-7-acc73adcca82> in <module>() 3 for i in range(0, len(lines)-2): 4 for j in range(1, len(lines)-1): ----> 5 similarity = wn.synsets(lines[i], lang='eng')[0].path_similarity(wn.synsets(lines[j], lang='eng')[0]) 6 if similarity > 0.3: 7 print( lines[i] + '-' +lines[j] + similarity) IndexError: list index out of range
②
あとは、例えば「りんご - みかん」の類似度計算が何らかの理由でエラーになってしまった場合、現状のコードでは、そのあとの「りんご - ねこ」の計算は実行されないと思うのですが、例外処理はどこに書くことになるでしょうか。
補足情報(FW/ツールのバージョンなど)
Python 3.6.3
Mac OS High Sierra
Jupyter notebook 5.0.0
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/06/09 23:47
2018/06/10 10:48
退会済みユーザー
2018/06/10 12:42