1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

文章中の単語の出現数のカウント

Last updated at Posted at 2023-09-05

はじめに

社内で共有する機会があったのでドキュメントがあったほうが良かろうと備忘録も兼ねて簡単に作成してます。

環境

  • 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)

お疲れさまでした。あとは適当にアレンジして活用してください。おしまい!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?