【備忘録】Python実践データ分析100本ノック ノック96

直前に引き続き。

 

●適当に自分の実行環境バージョンとか

Windows10 Pro

conda version : 4.10.1
conda-build version : 3.21.4
python version : 3.8.8.final.0  

 

●本来実行したいコード

all_words =
parts = ["名詞"]
for n in range(len(survey)):
    text = survey["comment"].iloc[n]
    words = tagger.parse(text).splitlines()
    words_arr =

    for i in words:
        if i == "EOS" or i == "": continue
        word_tmp = i.split()[0]
        part = i.split()[1].split(",")[0]
        if not (part in parts):continue
        words_arr.append(word_tmp)
    all_words.extend(words_arr)
print(all_words)

●本来の出力結果

['駅前', '若者', 'スポーツ', '場所', 'の', '子育て', '支援', '保育園', '駅前', '商店', '街', 

(後略)

●出てしまう結果

①前記事に倣って赤字の部分を直す

all_words =
parts = ["名詞"]
for n in range(len(survey)):
    text = survey["comment"].iloc[n]
    words = tagger.parse(text).splitlines()
    words_arr = []
    for i in words:
        if i == 'EOS' or i == '': continue
        word_tmp = i.split()[0]
        part = i.split()[4].split("-")[0]
        if not (part in parts):continue
        words_arr.append(word_tmp)
    all_words.extend(words_arr)
print(all_words)

●エラーになる

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-101-262886140a31> in <module>
      9         word_tmp = i.split()[0]
     10         #if word_tmp == '、' or word_tmp == '。' or word_tmp == '?': continue
---> 11         part = i.split()[4].split("-")[0]
     12         if not (part in parts):continue
     13         words_arr.append(word_tmp)

IndexError: list index out of range

 

②エラー原因調査

なんでやねんと思ったのでprint(i)の出力結果を見てみると下記の結果までは出力され、その後エラー。

(前略)

ある    アル    アル    有る    動詞-非自立可能    五段-ラ行    終止形-一般    1
。            。    補助記号-句点           

 

でまあ言ってしまえば「。」の行はi.split()[4]に対応するほど要素数がないのでエラーですと。

 

③要素数の少ないデータの時if文で逃げる。

非常に美しくないけど、とりあえず下記の赤字の部分のハードコーディングで逃げる。

「、」「。」「?」の3つの時はpart = i.split()[4].split("-")[0]をせずcontinueに行きます。

まあ実際の現場で使うようなちゃんとしたもの作る場合は要素数を数えてなんとかするのがいいと思うけど別にここではとりあえず動けばいいので。

all_words =
parts = ["名詞"]
for n in range(len(survey)):
    text = survey["comment"].iloc[n]
    words = tagger.parse(text).splitlines()
    words_arr =

    for i in words:
        if i == 'EOS' or i == '': continue
        word_tmp = i.split()[0]
        if word_tmp == '、' or word_tmp == '。' or word_tmp == '?': continue
        part = i.split()[4].split("-")[0]
        if not (part in parts):continue
        words_arr.append(word_tmp)
    all_words.extend(words_arr)
print(all_words)

●出力結果

['駅前', '若者', 'スポーツ', '場所', '子育て', '支援', '保育', '駅前', '商店', '生活',

(後略)

●本来の出力結果

['駅前', '若者', 'スポーツ', '場所', 'の', '子育て', '支援', '保育園', '駅前', '商店', '街', 

(後略)

 

とりあえずこれでやりたかったことはできたと思うが、

元々用意されていた回答と若干出力が異なる。

「の」がない、「保育園」が「保育」になっている(print(i)で確認すると園は下記のように接尾辞になっているため出てこない)、

園    エン    エン    園    接尾辞-名詞的-一般    

などの違いがみられる。

 

まあこれに関してはtagger.parse(text).splitlines()の段階で違うということなので、

バージョン違いのせいかなということにして気にしないことにする。

 

しかしこの後のノックで「の」の削除とかあるので若干問題がある。

頻出単語も変わってるので書籍の通りには進められないかな。

まあ、残り少しだし読めばわかるし機能が便利なったということでいいか。