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
この場合、/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
に出現単語の一覧が入る。
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()
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()
コサイン類似度で似た特徴量成分のレコードを探す
コサイン類似度については以下の記事が分かり易い。
コサイン類似度を利用し、集団の類似性を測ってみる - 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()
対象文書のindexと類似度がわかる。
リンク