Python Docker Anaconda環境でMeCabを利用する

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

MeCabのインストール

! apt-get install -y mecab libmecab-dev mecab-ipadic mecab-ipadic-utf8 file
! pip3 install mecab-python3

これだけでは、以下のようにmecabrcがないと怒られるので、

# no such file or directory: /usr/local/etc/mecabrc

mecabrcを指定のパスにコピーする必要がある。

! cp /etc/mecabrc /usr/local/etc/

尚、mecab-ipadic-neologdのような辞書を取り込み、mecabrcを更新する場合は必ず、/usr/local/etc/mecabrcも更新しよう。なので、コピーよりシンボリックリンクなんかのほうが良かったかも(^_^;)

以上でPythonからMeCabを利用できる。


追記

mecabrcのエラーはpipで辞書を登録することによって解決できます。

$ pip3 install unidic-lite

GitHub - SamuraiT/mecab-python3: mecab-python. you can find original version here //taku910.github.io/mecab/

この場合、/etc/mecabrc を作成する為にインストールした以下コマンドは実施する必要はありません。

! apt-get install -y mecab libmecab-dev mecab-ipadic mecab-ipadic-utf8 file


MeCabで出現単語をカウントする

名詞の単語ごとに出現数を集計する

import MeCab
import pandas as pd

tagger = MeCab.Tagger()
text_df = pd.read_csv("data.csv")
all_words = []
parts = ["名詞"]
for n in range(len(text_df)):
    text = text_df["text"].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)        

`all_wordsに出現単語の一覧が入る。

f:id:letitride:20200720203726p:plain:w500


all_wordsの単語を集計する
all_words_df = pd.DataFrame({"words":all_words, "count":1})
all_words_df = all_words_df.groupby("words").sum()
all_words_df.sort_values("count", ascending=False).head()

f:id:letitride:20200720203750p:plain:w120


1レコード毎に単語を特徴量として抽出する

parts = ["名詞"]
all_words_df = pd.DataFrame()
satisfaction = []
for n in range(len(text_df)):
    text = text_df["text"].iloc[n]
    words = tagger.parse(text).splitlines()
    words_df = pd.DataFrame()
    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_df[word_tmp] = [1]
    all_words_df = pd.concat([all_words_df, words_df], ignore_index=True)
all_words_df.head()

f:id:letitride:20200720204208p:plain:w500


コサイン類似度で似た特徴量成分のレコードを探す

コサイン類似度については以下の記事が分かり易い。

コサイン類似度を利用し、集団の類似性を測ってみる - Qiita


import numpy as np

target_text = all_words_df.iloc[2]

cos_sim = []
for i in range(len(all_words_df)):
    cos_text = all_words_df.iloc[i]
    cos = np.dot(target_text, cos_text) / (np.linalg.norm(target_text) * np.linalg.norm(cos_text))
    cos_sim.append(cos)
all_words_df["cos_sim"] = cos_sim
all_words_df.sort_values("cos_sim", ascending=False).head()

f:id:letitride:20200720205011p:plain:w500

対象文書のindexと類似度がわかる。