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

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

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

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

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

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

Python

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

Q&A

解決済

2回答

3523閲覧

Pythonで読み込んだcsvファイルの指定の行を取得するプログラムのエラーについて

退会済みユーザー

退会済みユーザー

総合スコア0

Jupyter

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

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/06/09 12:45

編集2018/06/09 23:46

前提・実現したいこと

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

もし

python

1import csv

しただけでcsv的に処理されるとか、

python

1import pandas as pd

しただけでpandas的に使えるようになるという魔法を信じているのなら、今すぐその考えを捨ててください。そんな技術はありません。

fの型はざっくり言えばファイルオブジェクトです。fはファイルオブジェクトなので、ilocも当然無理です。

今回の質問の内容を実現する方針は2つあって、

  • pd.read_csvとか使って最初からdfで読む
  • pandasを使うのはやめてcsvをちまちま処理する

どっちでもできると思います。まあ、これくらいの内容なら、正直pandasは使っても使わなくても手間は変わりません。

linesをせっかく読み込んだのだから、使ってあげてください・・・。f.iloc[i]みたいなのをlines[i]とかにすれば、良いんじゃないでしょうか。

投稿2018/06/09 13:11

編集2018/06/09 13:12
hayataka2049

総合スコア30933

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

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

退会済みユーザー

退会済みユーザー

2018/06/09 23:47

ご回答いただきましてありがとうございます。 質問に修正後と新たな問題について明記させていただました。 可能であれば、そちらについてもアドバイスいただけますと幸いです。よろしくお願いいたします。
hayataka2049

2018/06/10 10:48

書いてある通りインデックシングのどれかがおかしいんですが、何しろ一行に similarity = wn.synsets(lines[i], lang='eng')[0].path_similarity(wn.synsets(lines[j], lang='eng')[0]) 4つもあるとどれが駄目なのかわかりませんね。ばらして確認しましょうか。 w1_word = lines[i] w1_syn = wn.synsets(w1_word, lang='eng')[0] w2_word = lines[j] w2_syn = wn.synsets(w2_syn, lang='eng')[0] similarity = w1_syn.path_similarity(w2_syn) こう書き換えると、どの段階でエラーが出るのか特定できます ところでlang='eng'でいいんですか?
退会済みユーザー

退会済みユーザー

2018/06/10 12:42

ご指摘いただきましてありがとうございます。 lang='jpn'が正しいです。
guest

0

AttributeError: '_io.TextIOWrapper' object has no attribute 'iloc'

エラーメッセージを素直に読んでみますと、'_io.TextIOWrapper' オブジェクトには、'iloc'アトリビュートがありません、となります。

ソースの中の、iloc と書いているところをよくチェックしてみましょう

投稿2018/06/09 13:05

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問