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

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

ただいまの
回答率

90.51%

  • Python 3.x

    6399questions

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

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

解決済

回答 1

投稿

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

gymgym

score 67

review_df = pd.read_table('reviews.txt', encoding='utf-8', engine='python', sep=' __SEP__ ', header=None, names=['num','text'])

# テキストを形態素解析して「動詞」、「名詞」、「形容詞」のリストを返す
def get_wordlist(text):
    parsed = m.parse(text)      # 形態素解析結果(改行を含む文字列として得られる)
    lines = parsed.split('\n')  # 解析結果を1行(1語)ごとに分けてリストにする
    lines = lines[0:-2]         # 後ろ2行は不要なので削除
    diclist = []
    word_list = []
    for word in lines:
        l = re.split('\t|,',word)  # 各行はタブとカンマで区切られてるので
        d = {'Surface':l[0], 'POS1':l[1], 'POS2':l[2], 'BaseForm':l[7]}
        diclist.append(d)
    for dic in diclist:
        if (dic['POS1'] == u'名詞' or dic['POS1'] == u'動詞' or dic['POS1'] == u'形容詞'):
            word_list.append(dic['Surface'])
    return(word_list)

m = MeCab.Tagger('')

wordlist = []

for i in range(review_df.shape[0]):
    ret = get_wordlist(review_df.loc[i, 'text'])
    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です。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

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

import MeCab
m = MeCab.Tagger('')

ret = m.parse('すもも')
print(type(ret),ret) # <class 'str'> すもも    名詞,一般,*,*,*,*,すもも,スモモ,スモモ

ret = m.parse('')
print(type(ret),ret) # <class 'str'> EOS

ret = m.parse(None)
print(type(ret),ret) # <class 'bool'> False

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/12 14:50

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

    キャンセル

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

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

関連した質問

  • 解決済

    【Python】標準入出力におけるリスト格納について

    前提・実現したいこと ここに質問したいことを詳細に書いてください (例)PHP(CakePHP)で●●なシステムを作っています。 ■■な機能を実装中に以下のエラーメッセージが

  • 解決済

    python3 入力

    python3にて 12 234 567 89 1234 ... ... 345 のように 行数指定のない任意の行数の入力を a[0]=12 a[1]=234 a[3]=5

  • 解決済

    配列の要素のインデックスが取れない

    配列の要素を2つ削除できないです。 lines = [3, 4, 0, 1, 8, 2, 7, 3, 10, 2, 7, 0, 10, 10, 10, 9, 1, 3] fo

  • 解決済

    PYTHONの正規表現による置換について

    前提・実現したいこと ここに質問したいことを詳細に書いてください PYTHON言語、初心者です。>< 特定文字列(\t)で始まる行について、 空白で囲まれているか行末の文字

  • 解決済

    pythonのmultiprocessingを利用しているがCPU使用率があまり上がっていない

    タイトル通りです pythonのmultiprocessingを利用して、並列処理を行っていますが タスクマネージャを見ると、CPU使用率があまり上がっていません CPUを最大

  • 解決済

    Pythonのrandomについて

    Pythonのrandomについての質問です。 ディクショナリーの中にある全てのキーをランダムで被り無く、出したいのですがどうすればよいでしょう。 全てのキーは dic

  • 解決済

    数字の要素をキーにして配列から辞書を作りたい

     前提・実現したいこと 数字の要素をキーにして配列から辞書を作りたい。 今配列listsに lists = ["1","東京","神奈川","千葉","2","群馬","茨城"

  • 解決済

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

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

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

  • Python 3.x

    6399questions

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