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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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

解決済

1回答

418閲覧

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/18 03:16

編集2018/06/18 09:39

前提・実現したいこと

Pythonで単語が1列に書いてあるcsvファイルを読み込み、
各単語間の類似度を計算してその数値を表示するプログラムを書いています。
類似度が一定数以上の組み合わせを出力したいです。

sample.csv

りんご いぬ いちご くま みかん ねこ

出力したい結果(数値は仮)

りんご - いちご 0.3 ...

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

前回の質問に対するご回答を受けて、
修正したのですが、以下のようなエラーが出てしまい、どのように修正したら良いかわからず困っています。

IndexError Traceback (most recent call last) <ipython-input-15-f5997b50ec24> in <module>() 4 for j in range(1, len(lines)-1): 5 w1_word = lines[i] ----> 6 w1_syn = wn.synsets(w1_word, lang='jpn')[0] 7 w2_word = lines[j] 8 w2_syn = wn.synsets(w2_syn, lang='jpn')[0] IndexError: list index out of range

該当のソースコード

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', header=None) 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 w1_word = lines[i] 18 w1_syn = wn.synsets(w1_word, lang='jpn')[0] 19 w2_word = lines[j] 20 w2_syn = wn.synsets(w2_syn, lang='jpn')[0] 21 similarity = w1_syn.path_similarity(w2_syn) 22 if similarity > 0.3: 23 print( lines[i] + '-' + lines[j] + similarity)

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

Python 3.6.3
Mac OS High Sierra
Jupyter notebook 5.0.

###ご回答を受けて試したこと
①csvから読み込んだデータでもできるかどうか試しましたが、以下の結果が出てしまいました、

Python

1from nltk.corpus import wordnet as wn 2from jaconv import hira2kata 3data = open('sample.csv', 'r').readlines() 4data_with_syn = [] 5 6print(data) 7 8#結果 ['\ufeffりんご\n', 'いぬ\n', 'いちご\n', 'くま\n', 'みかん\n', 'ねこ'] 9 10for datum in data: 11 ret = wn.synsets(datum, lang='jpn') 12 if ret: 13 data_with_syn.append((datum, ret[0])) 14 continue 15 16 datum = hira2kata(datum) 17 ret = wn.synsets(datum, lang='jpn') 18 if ret: 19 data_with_syn.append((datum, ret[0])) 20 continue 21 22 print(f'Unknown word: {datum}.') 23 24print(*data_with_syn, sep='\n')

結果

Unknown word: リンゴ . Unknown word: イヌ . Unknown word: イチゴ . Unknown word: クマ . Unknown word: ミカン . ('ネコ', Synset('cat.n.01'))

②単語を英語にした場合、jaconvは使えないため、エラー処理に困る

python

1from nltk.corpus import wordnet as wn 2#from jaconv import hira2kata 3 4data = ['apple', 'dog', "strawberry", 'bear', 'orange', 'cats'] 5data_with_syn = [] 6 7for datum in data: 8 ret = wn.synsets(datum, lang='en') 9 if ret: 10 data_with_syn.append((datum, ret[0])) 11 continue 12 13 #datum = hira2kata(datum) 14 #ret = wn.synsets(datum, lang='en') 15 #if ret: 16 #data_with_syn.append((datum, ret[0])) 17 # continue 18 19 print(f'Unknown word: {datum}.') 20 21print(*data_with_syn, sep='\n')

エラー文

--------------------------------------------------------------------------- WordNetError Traceback (most recent call last) <ipython-input-29-f740c715a42a> in <module>() 1 for datum in data: ----> 2 ret = wn.synsets(datum, lang='en') 3 if ret: 4 data_with_syn.append((datum, ret[0])) 5 continue ~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py in synsets(self, lemma, pos, lang, check_exceptions) 1494 1495 else: -> 1496 self._load_lang_data(lang) 1497 synset_list = [] 1498 for l in self._lang_data[lang][1][lemma]: ~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py in _load_lang_data(self, lang) 1135 1136 if lang not in self.langs(): -> 1137 raise WordNetError("Language is not supported.") 1138 1139 f = self._omw_reader.open('{0:}/wn-data-{0:}.tab'.format(lang)) WordNetError: Language is not supported.

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

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

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

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

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

guest

回答1

0

ベストアンサー

『リンゴ』は登録されているけれど、『りんご』は未登録のようです。

Python

1>>> from nltk.corpus import wordnet as wn 2>>> wn.synsets('りんご', lang='jpn') 3[] 4>>> wn.synsets('リンゴ', lang='jpn') 5[Synset('apple.n.01'), Synset('apple.n.02')]

返り値を見て、未登録の場合は別フローに入るべきかと。

Python

1data = ['りんご', 'いぬ', 'いちご', 'くま', 'みかん', 'ねこ'] 2data_with_syn = [] 3 4for datum in data: 5 ret = wn.synsets(datum, lang='jpn') 6 if ret: 7 data_with_syn.append((datum, ret[0])) 8 else: 9 pass 10 11print(data_with_syn) # [('いぬ', Synset('spy.n.01'))]

『いぬ』しかないですね。

追記

jaconvという良さげなモジュールがあったので、使ってみました。

Python

1from nltk.corpus import wordnet as wn 2from jaconv import hira2kata 3 4data = ['りんご', 'いぬ', 'いちご', 'くま', 'みかん', 'ねこ'] 5data_with_syn = [] 6 7for datum in data: 8 ret = wn.synsets(datum, lang='jpn') 9 if ret: 10 data_with_syn.append((datum, ret[0])) 11 continue 12 13 datum = hira2kata(datum) 14 ret = wn.synsets(datum, lang='jpn') 15 if ret: 16 data_with_syn.append((datum, ret[0])) 17 continue 18 19 print(f'Unknown word: {datum}.') 20 21print(*data_with_syn, sep='\n')

標準出力

plain

1('リンゴ', Synset('apple.n.01')) 2('いぬ', Synset('spy.n.01')) 3('イチゴ', Synset('strawberry.n.01')) 4('クマ', Synset('bear.n.01')) 5('ミカン', Synset('orange.n.01')) 6('ネコ', Synset('cat.n.01'))

良い感じですね。

追記2

これ、『政府の犬』とかそっちの方の『いぬ』ですね...

Python

1>>> wn.synsets('いぬ', lang='jpn') 2[Synset('spy.n.01')] 3>>> wn.synsets('spy') 4[Synset('spy.n.01'), Synset('spy.n.02'), Synset('descry.v.01'), Synset('spy.v.02'), Synset('spy.v.03'), Synset('spy.v.04')] 5>>> 6>>> wn.synsets('イヌ', lang='jpn') 7[Synset('dog.n.01')]

質問追記を受けて

csvから読み込んだデータでもできるかどうか試しましたが、以下のようにエラーが出てしまいました。

pandasのオブジェクトをそのまま渡しているからですね。
個人的にはpandasどころかcsvもいらないと思います。テキストファイルで良いのでは。

単語を英語にした場合、jaconvは使えないため、エラー処理に困る

str.isalphaを使えば...

Python

1>>> 'いぬ'.isalpha() 2True 3>>> 'dog'.isalpha() 4True

えっ?
Qiita - [修正] Python 文字列の英数字判定でハマった

こう書かねばならないようです。

Python

1>>> 'いぬ'.encode('utf-8').isalpha() 2False 3>>> 'dog'.encode('utf-8').isalpha() 4True

投稿2018/06/18 03:59

編集2018/06/18 06:45
LouiS0616

総合スコア35658

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

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

退会済みユーザー

退会済みユーザー

2018/06/18 05:09

ご回答いただきましてありがとうございます。 追記2に関して、ひらがなの「いぬ」だと'spy.n.01'となるので、今回の場合は jaconvのhira2kataを使って全部カタカナにした方がよいということになりますでしょうか。
LouiS0616

2018/06/18 05:12

今回の例に関して言えばそうなりますね。
退会済みユーザー

退会済みユーザー

2018/06/18 06:22

お返事ありがとうございます。 試したことにcsvファイルからデータを読み込む方法について追記しました。 可能でしたらこちらもアドバイスいただけますと幸いです。 よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2018/06/18 09:31

ご回答の追記をいただきましてありがとうございます。 試したこと①に関しまして、テキストファイルで読み込んだところ、1文字ずつ扱われてしまいました。 別質問をした方が良いでしょうか。
LouiS0616

2018/06/18 09:34

data = open('sample.csv', 'r').readlines() で読み取れると思いますよ。
退会済みユーザー

退会済みユーザー

2018/06/18 09:40

修正しましたが、引きつづき、csvから読み取ろうとするとうまくいかないようです。
LouiS0616

2018/06/18 09:46

改行文字を消すのを忘れてました。 data = [line.strip() for line in open('sample.csv', 'r').readlines()] ですかね。 --- 先頭の変な文字『\ufeff』は、BOMです。 csvをBOMなしのutf-8で保存しなおしてください。 BOMなしで保存する方法はググるといろいろ出てくるはず。
LouiS0616

2018/06/18 09:59 編集

あるいは読み取り時にBOMを消すのもアリですね。 data = [line.strip() for line in open(略).readlines()] data[0] = data[0].lstrip('\ufeff')
退会済みユーザー

退会済みユーザー

2018/06/18 10:14

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問