Shingoの数学ノート

プログラミングと機械学習のメモ

Pythonで文章の近さを計算しよう1(形態素解析)

自然言語処理の初歩から解説していきます。初心者でもわかりやすいものにできたらいいなと思います。

文章の近さを計算する方針

以下の3つの文章の類似度を求めたい。

  1. 私はリンゴを食べる。

  2. 私はバナナを食べる。

  3. 私はリンゴを買う。

なんとなく「aとb」「aとc」が近そうなイメージを持つ。このイメージを数値で表すことを考えよう。

基本的な方針として、次の方法を考える。

  1. 単語を分かち書きする。(形態素解析)

  2. 文章を単語の頻度でベクトル化する。(bag-of-words/TF-IDF)

  3. ベクトルの類似度を算出する。(cos類似度)

今回は1を解説する。

N-gramと形態素解析

機械学習ではデータをうまく特徴量に変換することが求められる。文章でも同様だ。文章をベクトル化するには文字、または単語に分解する必要がある(分かち書き)。N個の文字に分解する手法をN-gram、単語(形態素)を分割し、品詞等を特定する手法を形態素解析という。今回は形態素解析を取り上げる。

分かち書き

形態素解析の実装

日本語は英語のように単語ごとに区切りがないので、形態素解析器によって分割する必要がある。形態素解析器はたくさんあるが、汎用性を考えてMeCabを使用することにする。なお、辞書はneologdを使用すると精度がかなり上がる。

WindowsでのMeCabのインストール方法は以下のリンク先がわかりやすい。

Windowsの環境を壊したくなければ、Google Colaboratoryで試してみるとよい。Google Colaboratoryの詳細は以下を参照のこと。

Google Colabの知っておくべき使い方 – Google Colaboratoryのメリット・デメリットや基本操作のまとめ

ColaboratoryでMeCab+neologdを使用するには、以下のコマンドを打とう。(mecabの0.996.2以降のインストールはこちら)

python
# MeCab_install !apt-get -q -y install sudo file git curl mecab libmecab-dev mecab-ipadic-utf8 swig !pip install mecab-python3==0.996.1 # using neologd !git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git !echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n > /dev/null 2>&1 !echo "dicdir = "`mecab-config --dicdir`"/mecab-ipadic-neologd" > "/etc/mecabrc"

実際にMeCabをpythonから実行してみよう。

python
import MeCab

t = MeCab.Tagger()
print(t.parse("私はリンゴを食べる。"))

結果

text
私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ は 助詞,係助詞,*,*,*,*,は,ハ,ワ リンゴ 名詞,一般,*,*,*,*,リンゴ,リンゴ,リンゴ を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 食べる 動詞,自立,*,*,一段,基本形,食べる,タベル,タベル 。 記号,句点,*,*,*,*,。,。,。 EOS

これで、単語の分かち書きを作成することができた。次回で、この分かち書きした文章のベクトル化を試みる。

Comments

Loading comments...