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

技術書系って年月経るにつれてソフトウェアのバージョンとかの関係で同じようにやってもうまくいかないことありけり。

そんなとき個人ブログに助けられることもあるのでワイも書いておきます。

どの本のどこっていうのはタイトル参照。

 

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

Windows10 Pro

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

 

●本来実行したいコード

import MeCab
tagger = MeCab.Tagger()
text = "すもももももももものうち"
words = tagger.parse(text).splitlines()
words_arr =
parts = ["名詞", "動詞"]
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)
words_arr

●出力結果

[]

 

①どういうこっちゃねんということでまずif not (part in parts):continueで使われてるpartの内容を知るために

print(part)

をfor文中に入れたら↓の出力結果になりました。

 

スモモ

モモ

モモ

ウチ

 

②上の結果がそもそもparts = ["名詞", "動詞"]と関係なさそうやんってことでi.split()[X]のX部分の数字を変えてみる。で色々試していくうちに発見。

part = i.split()[4].split(",")[0]

上記のように4にすると出力結果は↓の通り。

名詞-普通名詞-一般
助詞-係助詞
名詞-普通名詞-一般
助詞-係助詞
名詞-普通名詞-一般
助詞-格助詞
名詞-普通名詞-副詞可能

 

③使えそうじゃんってなるけどsplit(",")だと上手くいかないのでsplit("-")に変えると出力結果は↓の通り。

名詞
助詞
名詞
助詞
名詞
助詞
名詞

 

④print(part)を消して変更箇所は下記の通りだけであることを確認して実行。

  #変更前 part = i.split()[1].split(",")[0]
    part = i.split()[4].split("-")[0]

●出力結果(本の通り)

['すもも', 'もも', 'もも', 'うち']

 

 

書籍の環境だとtagger.parse(text).splitlines()で取得した配列内での"名詞-普通名詞-一般"とかの位置が異なるんですかね?

あと区切り文字が-じゃなくて,だったのか。知らんけど。

とりあえず動いたのでヨシ。

 

ちなみにprint(words)でtagger.parse(text).splitlines()の中身を確認すると下記の通り。

['すもも\tスモモ\tスモモ\t李\t名詞-普通名詞-一般\t\t\t0', 'も\tモ\tモ\tも\t助詞-係助詞\t\t\t', 'もも\tモモ\tモモ\t桃\t名詞-普通名詞-一般\t\t\t0', 'も\tモ\tモ\tも\t助詞-係助詞\t\t\t', 'もも\tモモ\tモモ\t桃\t名詞-普通名詞-一般\t\t\t0', 'の\tノ\tノ\tの\t助詞-格助詞\t\t\t', 'うち\tウチ\tウチ\t内\t名詞-普通名詞-副詞可能\t\t\t0', 'EOS']

 

1ループごとに'すもも\tスモモ\tスモモ\t李\t名詞-普通名詞-一般\t\t\t0'という単位で取ってくるので、

i.split()[4]

で0が先頭として前から5番目の名詞-普通名詞-一般を取ってきて、

.split("-")[0]

名詞を取ってきてるというわけね。

③のところで出力結果がループ回数分そんな感じで繰り返されてるのがわかりますね。