前回は
MeCab のインストールと、ユーザー辞書を構築するための環境を作った
今回は
前々回クロールしたサイトのタグ情報を MeCab の単語として登録していく部分を作っていく
コード書く
import numpy as np
import pandas as pd
import re
import MeCab
import subprocess
import os
# MeCab のシステム辞書 NEOLogd のディレクトリを取得
dicdir = subprocess.run(['mecab-config', '--dicdir'], capture_output=True).stdout.decode('utf-8').strip()
neologd_dir = os.path.join(dicdir, 'mecab-ipadic-neologd')
# 前々回クロールしてきた情報を読み込む
df = pd.read_csv('output.csv')
# タグを数えるための辞書
tag_count_dict = dict()
for index, row in df.iterrows():
tags_str = row['tags']
# 空のカラムは nan になっちゃうので nan の場合は無視
if type(tags_str) != str:
assert np.isnan(tags_str)
continue
tags = tags_str.split(',')
# タグの出現回数を数える
for tag in tags:
# 最初に # から始まるハッシュタグっぽいのは # を除外
tag = re.sub(r'^#', '', tag)
if tag not in tag_count_dict:
tag_count_dict[tag] = 0
tag_count_dict[tag] += 1
# 2 回以上使われてるタグを抽出
tag_list = np.array(sorted(tag_count_dict.items(), reverse=True, key=lambda pair: pair[1]))[:,0]
# 未知語抽出
unknown_tag_list = []
unknown_tagger = MeCab.Tagger(f'--unk-feature __unk__ -d {neologd_dir}')
for tag in tag_list:
if unknown_tagger.parse(tag).split()[1] == '__unk__':
unknown_tag_list.append(tag)
tagger = MeCab.Tagger(f'-d {neologd_dir}')
for tag in unknown_tag_list:
# 未知語を MeCab で parse
# (これで既知語の組み合わせとして取得できれば、そこから読みがわかる)
tag_component_line_list = tagger.parse(tag).splitlines()
# 既知語の単語を組み合わせて、雑に読みを作っていく
yomi_component_list = []
for tag_component_line in tag_component_line_list:
if tag_component_line == 'EOS':
break;
tag_component, features_str = tag_component_line.split()
features = features_str.split(',')
# 既知語として取得できるか確認
if len(features) > 7 and features[7] != '*':
# 読みの情報を取得
yomi_component = features[7]
else:
# 既存の単語から読みを持ってこれない場合はそのまま
yomi_component = tag_component
yomi_component_list.append(yomi_component)
# 既知語の読みを組み合わせて、未知語の読みにする
yomi = ''.join(yomi_component_list)
# CSV として stdout に出す
new_features = (tag, '', '', '', '名詞', '一般', '*', '*', '*', '*', tag, yomi, yomi, '追加エントリ')
print(','.join(new_features))
こんな感じ
実行
さっき書いたコードを実行して、リダイレクトして ero_words.csv を作る
それを前回作った make_dic.sh を実行して dic ファイル化する
結果
mecab を実行してみる
$ mecab -d "$(mecab-config --dicdir)/mecab-ipadic-neologd"
彼女は彼のクリフェラでアヘオホとイキ声を晒した
彼女 名詞,代名詞,一般,*,*,*,彼女,カノジョ,カノジョ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
彼 名詞,代名詞,一般,*,*,*,彼,カレ,カレ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
クリフェラ 名詞,一般,*,*,*,*,クリフェラ,クリフェラ,クリフェラ,追加エントリ
で 助詞,格助詞,一般,*,*,*,で,デ,デ
アヘオホ 名詞,一般,*,*,*,*,アヘオホ,アヘオホ,アヘオホ,追加エントリ
と 助詞,並立助詞,*,*,*,*,と,ト,ト
イキ声 名詞,一般,*,*,*,*,イキ声,イキゴエ,イキゴエ,追加エントリ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
晒し 動詞,自立,*,*,五段・サ行,連用形,晒す,サラシ,サラシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
このように、クリフェラ、アヘオホ、イキゴエなどが登録された
これから
ero_words.csv は我が子のようにちゃんと育てて行こうと思う
次回は
前々回クロールしたデータを LightGBM を使って、特徴の重要度を測っていく