はじめに
社内で共有する機会があったのでドキュメントがあったほうが良かろうと備忘録も兼ねて簡単に作成してます。
環境
- wsl2
- python3.10.12
パッケージのインストール
pip install pandas re csv MeCab
sudo aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file
MeCab-ipadic-NEologdの辞書の追加
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
パッケージのインポート
import MeCab
import re
import csv
import pandas as pd
csvファイルの読み込み
with open('xxx.csv', 'r', encoding='utf8')as f:
df = pd.read_csv(f)
辞書のパスの確認
MeCabで辞書を使うためにはTaggerの中で辞書のパスを指定して上げる必要があります。そのためのパスをechoコマンドで確認しましょう。
echo `mecab-config --dicdir`"/mecab-ipadic-neologd"
# /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
MeCabで分かち書き
以上を行ったら読み込んだcsvファイルを分かち書きしていきましょう。
今回は分かち書きをした後、名詞だけ取得しています。
# 人によっては以下のパスは異なるので確認してね
mecab = MeCab.Tagger('-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd')
mecab.parse('') # バグ対処
results = []
lines = df['text']
use_parts = ['名詞']
for line in lines:
r = []
# 学習に使わない表現の削除処理
s = line
s = s.replace("|", "")
s = re.sub(r'《.+?》', "", s)
s = re.sub(r'[.+?]', '', s)
# Mecab
node = mecab.parseToNode(s)
while node:
# 単語を取得
if node.feature.split(",")[6] == '*':
word = node.surface
else:
word = node.feature.split(",")[6]
# 品詞を取得
part = node.feature.split(",")[0]
if part in use_parts:
r.append(word)
node = node.next
rl = (" ".join(r)).strip()
results.append(rl)
print(results)
コード引用元https://qiita.com/sudo5in5k/items/f89d9dc1bec1ed221ede
MeCabでエラーが出たとき
私の環境では最初動かしたとき、macabrcが見つからねえよハゲとエラーが出ました。下のサイトを参考にした結果直りました。具体的にどうやったかは忘れました。
https://ikagadeshitaka.hatenablog.jp/entry/2020/09/29/235335
https://github.com/SamuraiT/mecab-python3#common-issues
ちなみに
MeCab自体の出力はどうなっているのかを知っておくと今後何処かで活かせると思うので念のため記しておきます。
s = '今日はいい天気ですね。'
node = mecab.parseToNode(s)
while node:
print(node.feature.split(","))
node = node.next
# ['BOS/EOS', '*', '*', '*', '*', '*', '*', '*', '*']
# ['名詞', '副詞可能', '*', '*', '*', '*', '今日', 'キョウ', 'キョー']
# ['助詞', '係助詞', '*', '*', '*', '*', 'は', 'ハ', 'ワ']
# ['形容詞', '自立', '*', '*', '形容詞・イイ', '基本形', 'いい', 'イイ', 'イイ']
# ['名詞', '一般', '*', '*', '*', '*', '天気', 'テンキ', 'テンキ']
# ['助動詞', '*', '*', '*', '特殊・デス', '基本形', 'です', 'デス', 'デス']
# ['助詞', '終助詞', '*', '*', '*', '*', 'ね', 'ネ', 'ネ']
# ['記号', '句点', '*', '*', '*', '*', '。', '。', '。']
# ['BOS/EOS', '*', '*', '*', '*', '*', '*', '*', '*']
最後に
あとは単語をキーに出現回数をカウントする辞書を作成しておしまいです。
今回、アルファベットの表記ゆれを防ぐため、全て小文字に直してます。
count_dic = {}
for r in results:
for w in r.split():
w = w.lower()
if w not in count_dic.keys():
count_dic[w] = 0
count_dic[w] += 1
sorted_count = sorted(count_dic.items(), key= lambda x:x[1], reverse=True)
with open('test.csv', 'w', newline='')as f:
writer = csv.writer(f)
writer.writerows(sorted_count)
お疲れさまでした。あとは適当にアレンジして活用してください。おしまい!