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

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

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

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

Python 3.x

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

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Q&A

解決済

1回答

1176閲覧

Python3でCSVを読み込み形態素解析するとUnicodeDecodeErrorになる

yu-imu

総合スコア35

CSV

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

Python 3.x

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

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

0グッド

0クリップ

投稿2018/11/16 03:22

編集2018/11/16 04:30

現在SQLインジェクションの研究を行っており
Pythonで形態素解析を行い辞書を作ろうと考えているのですが、
encodeing周りのエラーがわからず解決できません。

python

1mecab = MeCab.Tagger('mecabrc') 2 3 4def tokenize(text): 5 node = mecab.parseToNode(text) 6 while node: 7 if node.feature.split(',')[0] == '名詞': 8 yield node.surface.lower() 9 node = node.next 10 11 12def get_words(contents): 13 ret = [] 14 # ここのfor文のループでエラーが発生する 15 for content in contents: 16 ret.append(get_words_main(content)) 17 return ret 18 19 20def get_words_main(content): 21 return [token for token in tokenize(content)] 22 23if __name__ == '__main__': 24 column = [] 25 num = [] 26 with open('word.csv',encoding="utf8", errors='ignore') as f: 27 reader = csv.reader(f) 28 29 for row in reader: 30 column.append(row[0]) 31 num.append(row[1]) 32 33 data_train_s, data_test_s, label_train_s, label_test_s = train_test_split(column, num, test_size=0.3) 34 #この部分でコケる 35 words = get_words(data_train_s) 36 37

utf-8で保存してある読み込み用のcsvファイルです。

csv

1onLoading {Function},0 2onSuccess {Function},0 3onAfterRender {Function},0 4print(len([s for s in l if s.endswith('e')])),0 5select* from database where id = 1;,0 6Graph minors IV Widths of trees and well quasi ordering,0 7"1' UNION ALL SELECT CONCAT(0x716b6b6a71,(CASE WHEN (EXISTS(SELECT random FROM performance_schema.events_waits_summary_by_instance)) THEN 1 ELSE 0 END),0x716a717a71),NULL-- hYEx",1 8"1' UNION ALL SELECT CONCAT(0x716b6b6a71,(CASE WHEN (EXISTS(SELECT aTEC FROM zsTX)) THEN 1 ELSE 0 END),0x716a717a71),NULL-- utMa",1 9"1' AND (SELECT 2551 FROM(SELECT COUNT(*),CONCAT(0x716b6b6a71,(SELECT REPEAT(0x38,128)),0x716a717a71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a) AND 'uDRn'='uDRn",1 10"1' UNION ALL SELECT CONCAT(0x716b6b6a71,(CASE WHEN (EXISTS(SELECT creditcard_id FROM performance_schema.events_waits_summary_by_instance)) THEN 1 ELSE 0 END),0x716a717a71),NULL-- mwJp",1 11

ファイルを実行した結果以下のようなエラーが数回に一回発生します。

例1) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9 in position 0: invalid continuation byte
例2) UnicodeDecodeError: 'utf-8' codec can't decode byte 0x90 in position 0: invalid start byte

お答えしてほしい点として

1 UnicodeDecodeErrorが起きてしまっている原因箇所
2 encode問題の対処の仕方をお答えしてほしいです。

補足質問への回答
1 エラー発生時のdata_train_sの中身について
["print(len([s for s in l if s.endswith('e')]))", 'onSuccess {Function}', "1' UNION ALL SELECT CONCAT(0x716b6b6a71,(CASE WHEN (EXISTS(SELECT creditcard_id FROM performance_schema.events_waits_summary_by_instance)) THEN 1 ELSE 0 END),0x716a717a71),NULL-- mwJp", 'onAfterRender {Function}', "1' UNION ALL SELECT CONCAT(0x716b6b6a71,(CASE WHEN (EXISTS(SELECT aTEC FROM zsTX)) THEN 1 ELSE 0 END),0x716a717a71),NULL-- utMa", 'select* from database where id = 1;']

2 Tracebackの中身
Traceback (most recent call last):
File "svm.py", line 59, in <module>
words = get_words(data_train_s)
File "svm.py", line 30, in get_words
ret.append(get_words_main(content))
File "svm.py", line 35, in get_words_main
return [token for token in tokenize(content)]
File "svm.py", line 35, in <listcomp>
return [token for token in tokenize(content)]
File "svm.py", line 22, in tokenize
yield node.surface.lower()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb6 in position 0: invalid start byte

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

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

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

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

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

can110

2018/11/16 04:25

エラー発生時の「data_train_s」の中身を提示ください。またエラーはTraceback全文を記載ください。
yu-imu

2018/11/16 05:18

回答致しました。
guest

回答1

0

ベストアンサー

1 UnicodeDecodeErrorが起きてしまっている原因箇所

Tracebackからtokenize関数内のyield node.surface.lower()、名詞の単語を小文字に変換している処理で発生しています。

2 encode問題の対処の仕方をお答えしてほしいです。

しかしながら例示された入力文字列には英数字、記号しか含まれていないので本来このエラーは発生することはないと考えられます。
当方環境にて以下の再現コードを実行しましたが、やはりエラーは発生しません。
まずはyieldの手前にprintを置いてみて、エラー発生時の名詞の単語を特定してみてはいかがでしょうか?

あと気になったのですが、英文(SQL文)の解析にMeCabを使っているようですが、英語用の辞書を利用されていますか?
もし日本語辞書を利用していると正しく形態素解析できないので。

Python

1import MeCab 2mecab = MeCab.Tagger('mecabrc') 3 4def tokenize(text): 5 node = mecab.parseToNode(text) 6 while node: 7 if node.feature.split(',')[0] == '名詞': 8 # print(node.surface,node.feature) # 何が入っているか確認してみては? 9 yield node.surface.lower() 10 node = node.next 11 12 13def get_words(contents): 14 ret = [] 15 # ここのfor文のループでエラーが発生する 16 for content in contents: 17 ret.append(get_words_main(content)) 18 return ret 19 20 21def get_words_main(content): 22 return [token for token in tokenize(content)] 23 24if __name__ == '__main__': 25 """ 26 column = [] 27 num = [] 28 with open('word.csv',encoding="utf8", errors='ignore') as f: 29 reader = csv.reader(f) 30 31 for row in reader: 32 column.append(row[0]) 33 num.append(row[1]) 34 35 data_train_s, data_test_s, label_train_s, label_test_s = train_test_split(column, num, test_size=0.3) 36 """ 37 # ↑は発生エラーとは無関係なのでコメントアウト 38 39 data_train_s = ["print(len([s for s in l if s.endswith('e')]))", 'onSuccess {Function}', "1' UNION ALL SELECT CONCAT(0x716b6b6a71,(CASE WHEN (EXISTS(SELECT creditcard_id FROM performance_schema.events_waits_summary_by_instance)) THEN 1 ELSE 0 END),0x716a717a71),NULL-- mwJp", 'onAfterRender {Function}', "1' UNION ALL SELECT CONCAT(0x716b6b6a71,(CASE WHEN (EXISTS(SELECT aTEC FROM zsTX)) THEN 1 ELSE 0 END),0x716a717a71),NULL-- utMa", 'select* from database where id = 1;'] 40 words = get_words(data_train_s) 41 print(words)

投稿2018/11/16 08:16

can110

総合スコア38266

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問