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

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

ただいまの
回答率

90.52%

  • Python

    7928questions

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

  • Python 3.x

    6341questions

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

  • CSV

    633questions

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

  • Jupyter

    252questions

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

解決済

回答 2

投稿 編集

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

tenjin

score 214

 前提・実現したいこと

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'

 該当のソースコード

#csv読み込み
import csv
f = open("sample.csv", encoding='utf-8' )
lines = f.readlines()

#行の長さを確認する
import pandas as pd
import numpy as np
print(len(lines))

#1行目からlen(lines)、2行目からlen(lines)まで最終行まで比較を繰り返す
from nltk.corpus import wordnet as wn
for i in range(0, len(lines)-2):
    for j in range(1, len(lines)-1):
        similarity = wn.synsets(f.iloc[i], lang='jpn')[0].path_similarity(wn.synsets(f.iloc[j], lang='jpn')[0])
        if similarity > 0.3: #類似度0.3以上の組み合わせと数値を出力
            print( f.iloc[i] + '-' +f.iloc[j] + similarity)

 試したこと

WordNetを用いた類似度計算はこのようにできています。
この'人間'や'サル'の部分をcsvファイルから読み込んだデータに変換して計算したいです。

>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('人間', lang='jpn')[0].path_similarity(wn.synsets('サル', lang='jpn')[0])
0.1111111111111111

ご回答を受けて修正・新たな問題

import csv
f = open("sample.csv", encoding='utf-8' )
lines = f.readlines()

#行の長さを確認する
import pandas as pd
import numpy as np
print(len(lines))

dataset1 = pd.read_csv("sample.csv")
dataset1

#1行目からlen(lines)まで比較、2行目からlen(lines)まで比較を繰り返す
from nltk.corpus import wordnet as wn
for i in range(0, len(lines)-2):
    for j in range(1, len(lines)-1):
        similarity = wn.synsets(lines[i], lang='eng')[0].path_similarity(wn.synsets(lines[j], lang='eng')[0])
        if similarity > 0.3:
            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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

もし

import csv


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

import pandas as pd

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

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/10 08:47

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

    キャンセル

  • 2018/06/10 19: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 21:42

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 解決済

    AttributeError: 'module' object has no attribute '...

    AttributeError: 'module' object has no attribute 'getInitData' とエラーが出ました。 Data.pyに cla

  • 解決済

    ソート結果が正しくない

    前提・実現したいこと csvファイルdata1.csvおよびそれと同じフォーマットのcsvファイルdata2.csv, csvファイルdata3.csvのそれぞれに対して,温度(

  • 受付中

    大量のCSVデータの処理方法

    100個ほどCSVファイルがあり、 それぞれのファイルで、30×30のセルに数値が入力されています。 この100個のCSVファイルに対して、同じセル座標について最大値最小値を計算し

  • 解決済

    文字列を比較して配列に格納できない

    ans配列の要素の文字列の最初の文字がlinesの要素の最初の文字と一致するならlinesの2番目の要素('A'/'B'/'C'/'D')をline_alpha配列に格納する、とい

  • 解決済

    pythonでmapしたものをリストにしたい

    以下のようなコードがあり、実行すると 以下のようになります sdata = ["[0.2],[0.3]","[0.2]"] tu = sdata[0].replace("[",

  • 解決済

    nltkでの日本語WordNetの使い方

     前提・実現したいこと 以下の参考記事に沿って シソーラス距離(概念距離)をwordnetを使ってpythonで実装しようとしています。 参考記事 なお、参考記事ではpython2

  • 解決済

    printの表示を縦ではなく横に

    printの表示方法について知りたいです。 現在、数値が縦に並んでいるcsvファイルを読み込んで、欲しい範囲を指定して再びファイルに出力するというプログラムを作っています。 現在、

  • 解決済

    Pythonのfor文が思い通りに動かない

     前提・実現したいこと 例えば下のようなtxtファイルがあったとして 1 2 3 4 5 6 7 8 このファイルを読み込み、 それを、「1,2,3」と3行進んだら1行戻り、

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

  • Python

    7928questions

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

  • Python 3.x

    6341questions

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

  • CSV

    633questions

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

  • Jupyter

    252questions