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

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

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

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

Q&A

解決済

1回答

937閲覧

Pythonの形態素解析でAttributeErrorが発生する

syasai

総合スコア5

Python

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

0グッド

0クリップ

投稿2021/08/14 14:26

前提・実現したいこと

Pythonでjanomeを使って読み込んだCSVファイルの内容を形態素解析をしたいのですが、
「for token in tokenizer.tokenize(sentence):」のところで、AttributeErrorが発生してしまいます。
CSVファイルは3行1列に日本語のテキストが入っています。
よろしくお願いいたします。

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

AttributeError: 'list' object has no attribute 'strip'

該当のソースコード

python

1from janome.tokenizer import Tokenizer 2import csv 3 4tokenizer = Tokenizer() 5 6with open('keitaisokaiseki_sentence.csv') as f: 7 sentences = csv.reader(f) 8 9 for sentence in sentences: 10 print("===========================================") 11 print(sentence) 12 13 for token in tokenizer.tokenize(sentence): 14 print(" " + str(token))

試したこと

tokenizeは引数に文字列を渡す必要があるということでしたので、forでループさせてtokenizeに渡す用にしたのですがエラーが発生してしまいます。

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

PC:macbook

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

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

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

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

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

guest

回答1

0

ベストアンサー

csv.readerでは、ファイルの各行の内容が「文字列のリスト」として返されます。
あなたのプログラムでは、「文字列のリスト」をそのままtokenizeに渡しているので、そのようなエラーが発生します。

CSVファイルは3行1列に日本語のテキストが入っています。

という記述が正しいのであれば、1行にはひとつのテキストしか入っていないので(それでCSVと言えるの?)、プログラム中のprint(sentence)tokenizer.tokenize(sentence)を、それぞれprint(sentence[0])tokenizer.tokenize(sentence[0])とすれば動きます。

もし、行と列を混同していた場合は、1行に3つのテキストが含まれるので、それぞれを取り出してからtokenizeに渡す必要があります。

投稿2021/08/14 15:22

Daregada

総合スコア11990

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

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

syasai

2021/08/14 15:57

ご説明ありがとうございます。ご指摘いただいた2点修正すると問題なく動作しました。 すみません、(行、列)が(1,1),(2,1),(3,1)のセルに日本語のテキスト入っていると言いたかったです。 csv.readerの場合は、この場合に1つのリストで["1行目のテキスト", "2行目のテキスト", "3行目のテキスト"]が返されると思っていたのですが、そうではなく["1行目のテキスト"]["2行目のテキスト"]["3行目のテキスト"]の3つのリストが返されるためエラーとなったと理解しましたが、その認識で間違い無いでしょうか? よろしくお願いします。
Daregada

2021/08/14 16:11

その認識で合っています。 なお、その構造はCSVではないので、csv.readerを使わずに、f.readlinesで全行読み込み、forを回せば1行ずつの文字列を直接取り出せます。 for sentence in f.readlines(): print("===========================================") for token in tokenizer.tokenize(sentence): print(" " + str(token))
syasai

2021/08/15 00:33

ありがとうございます。 非常に勉強になりました。f.readlinesも使ってみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問