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以降のインストールはこちら)


#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から実行してみよう。


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

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

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


Comment Box is loading comments...