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

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

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

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

Q&A

解決済

1回答

15705閲覧

PythonでAttributeError: 'bool' object has no attribute 'split'のエラー

gymgym

総合スコア97

Python 3.x

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

0グッド

0クリップ

投稿2018/07/12 04:51

Python

1review_df = pd.read_table('reviews.txt', encoding='utf-8', engine='python', sep=' __SEP__ ', header=None, names=['num','text']) 2 3# テキストを形態素解析して「動詞」、「名詞」、「形容詞」のリストを返す 4def get_wordlist(text): 5 parsed = m.parse(text) # 形態素解析結果(改行を含む文字列として得られる) 6 lines = parsed.split('\n') # 解析結果を1行(1語)ごとに分けてリストにする 7 lines = lines[0:-2] # 後ろ2行は不要なので削除 8 diclist = [] 9 word_list = [] 10 for word in lines: 11 l = re.split('\t|,',word) # 各行はタブとカンマで区切られてるので 12 d = {'Surface':l[0], 'POS1':l[1], 'POS2':l[2], 'BaseForm':l[7]} 13 diclist.append(d) 14 for dic in diclist: 15 if (dic['POS1'] == u'名詞' or dic['POS1'] == u'動詞' or dic['POS1'] == u'形容詞'): 16 word_list.append(dic['Surface']) 17 return(word_list) 18 19m = MeCab.Tagger('') 20 21wordlist = [] 22 23for i in range(review_df.shape[0]): 24 ret = get_wordlist(review_df.loc[i, 'text']) 25 wordlist.append(ret)

reviews.txtから文章をPandasで読み込み、形態素解析で名詞と動詞と形容詞をとり出し、リストを作成したいです。

for i in range(review_df.shape[0]): ret = get_wordlist(review_df.loc[i, 'text']) wordlist.append(ret)

ここの部分で、for文で回すと

Traceback (most recent call last): File "dic.py", line 36, in <module> ret = get_wordlist(review_df.loc[i, 'text']) File "dic.py", line 18, in get_wordlist lines = parsed.split('\n') # 解析結果を1行(1語)ごとに分けてリストにする AttributeError: 'bool' object has no attribute 'split'

以上のようなエラーが出てしまいます。

データフレームの中にエラーをだす単語があると考えられるのですが、このような場合例外処理みたいなことを行えばエラーを回避できるのでしょうか。

解決策を教えていただきたいです。

よろしくお願い致します。

以下はreviews.txtの一部です。

5 __SEP__ 職場の義理チョコです。 パッケージが落ち着いた感じなので 年配の方にもいいと思います。 5 __SEP__ パッケージも包装も申し分無いです。ありがとうございましたか 5 __SEP__ さすがに帝国ホテル。美味しかった。バレンタイン用に主人に買いました。 5 __SEP__ 二人に贈ったのですがどちらも大変喜んでもらえました。一人はその場で写真を撮ったそうです。さすが帝国ホテル。大人っぽい雰囲気だったので選びました。 5 __SEP__ 主人用に購入したのですが、わけてもらって食べたらとてもおいしかったです。また購入したいです。 5 __SEP__ 人にプレゼントしてみました。あげた人はどうなのかわかりませんが、大人な雰囲気とリッチな感じがいいなと思いました。 5 __SEP__ バレンタインようにこのくらいの金額の商品で高級そうなものを探していました。プレートのものとこちらをお願いしました。 プレートと同じく包装紙やおリボンは高級感がありますが、裏のシールと個別のビニールの袋が残念です。 ソムリエギフトの商品はすぐに売り切れてしまうので、そこも欲しい時に悩んでいるのなくなり残念ですがショップのスタッフは丁寧です、 また、海外のお土産や、日本だけの習慣のホワイトディーようにこうにゅ痛いと思っています。 5 __SEP__ さすが 帝国ホテルさんです。とても美味しかったです。 バレンタインは これに決まり。 5 __SEP__ 主人が会社の後輩の女の子からバレンタインでもらってきたので、お返しに注文しました。 渡すのが後輩とのことで、帝国ホテルのネームバリューで選びました。 喜んでいただいたとのことです? 5 __SEP__ ホワイトデーのお返しに使用し、差し上げた方から高級で美味しく 有り難かったとのお礼を頂くほど喜ばれ、リピーターになりました。 5 __SEP__ 感謝を込めて贈りました。シンプルなビターチョコレートが良いと思い選びました。帝国ホテルのラベルもシンプルですが高級感が漂い良かったと思います。 5 __SEP__ 家族に送って好評だったので、自分用にも購入しました! ラッピングも高級感があり、チョコも美味しかったです。 5 __SEP__ 兄へのプレゼントで購入しました。 お手ごろ価格で購入できたので、良かったです。 4 __SEP__ バレンタインに50代の父に渡しました。パッケージからとても喜んでくれました。味も美味しいと喜んでくれました。ただ近くのスーパーに売っていたので★-1です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下の検証によると、parse関数に渡した値がNoneの場合、戻り値はstrではなくboolになるようです。
呼出元にて、textstrでなければ処理を飛ばすようにし、かつ念のため戻り値もstrか判定すればとりあえずエラーは回避できると思いますが、そもそもreview_df.loc[i, 'text']にて意図した値がとれているか確認したほうがよいでしょう。

Python

1import MeCab 2m = MeCab.Tagger('') 3 4ret = m.parse('すもも') 5print(type(ret),ret) # <class 'str'> すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ 6 7ret = m.parse('') 8print(type(ret),ret) # <class 'str'> EOS 9 10ret = m.parse(None) 11print(type(ret),ret) # <class 'bool'> False

投稿2018/07/12 05:37

can110

総合スコア38233

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

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

gymgym

2018/07/12 05:50

ありがとうございます。おかげさまで解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問