はじめまして、エンジニアのもけ太郎(仮名)です。
先日、コーヒーを飲もうとしたら「技術について何か書いてください!」とライブ感たっぷりにご依頼を受けたので、つい先日から取り組み始めた『自然言語解析』について書いていこうと思います。
◇
◇
まずは、自己紹介をさせてください。
私は、いつもサイトの開発業務を行っています。機械学習については興味があるものの、業務ではまだ利用したことはなく、スキルアップのため個人的に学習へと取り組んでいる真っ最中です。
本稿は、私と同様に「機械学習に興味はあるけど、どこから何をすれば良いか判らない……」という方の参考になればと思い『とりあえず動かしてみよう!』をテーマに書いていこうと思います。
◇
◇
まずは環境準備
さあ、第一回目となる今回。まずは、環境を準備していきましょう。
利用する技術は……
■データ抽出(形態素解析)には mecab
■機械学習には python のライブラリ
あとは、これらが動くサーバー環境が必要ですが、本編では vagrant 上の centOS 7.2 を利用しています。
- python 3.6の導入
yum install -y https://centos7.iuscommunity.org/ius-release.rpm yum install -y python36u python36u-libs python36u-devel python36u-pip
なお、centOS に標準導入されている python 2系があるため、本稿では python の実行コマンドは python3.6、 pip の実行コマンドは pip3.6 となります。
- mecabの導入
rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm yum install -y mecab mecab-devel mecab-ipadic
- mecab-pythonの導入
# pip3.6 install mecab-python3
これにて下ごしらえが完了です。
この段階で、python を通じて mecab を利用した形態素解析を行うことができます。
- ある文章を分かち書きしてみる
import MeCab import sys import string fi = open(sys.argv[1], 'r') fo = open(sys.argv[2], 'w') line = fi.readline() t = MeCab.Tagger (" ".join(sys.argv)) words = []; while (line): m = t.parseToNode(line) while m: # m.feature.split(',')[0] で 名詞や動詞など判定 word = m.feature.split(',')[6] words.append(word) m = m.next line = fi.readline() fo.write(' '.join(words)) fi.close() fo.close()
- 実行
# python3.6 wakachi.py input.txt output.txt
このコードによって文章が分かち書きされます。
カウントを取ることで頻出単語を見分けたり、名詞や動詞のみを抜き出したりすることも可能です。
◇
勢いに乗って
さあ、今回は勢いに乗ってこのまま機械学習にも取り組んでみましょう。
- 大量の口コミデータをもとに類語検索を行う
弊社の運営サイトに「てくてく」というペット施設の口コミサイトがあります。
今回は、てくてくに投稿された口コミのデータをもとに、gensim を利用してキーワード同士の関連性を学習させてみます。
もしかしたらサイト内のレコメンデーション機能として利用できるかもしれません。
- numpy、scipy、gensim の導入
# pip3.6 install numpy # pip3.6 install scipy # pip3.6 install --upgrade gensim
次にgensim を利用して、分かち書きファイルを読み込んでベクター情報を生成し、ファイルとして保存するコードを用意します。
- ベクター情報を作成する
from gensim.models import word2vec import sys words = word2vec.LineSentence(sys.argv[1]) model = word2vec.Word2Vec(words, sg=1, size=300, min_count=10, window=10) model.save(sys.argv[2])
最後にベクター情報をもとにシソーラスを表示してみましょう
- シソーラスを表示する
from gensim.models import word2vec import sys model = word2vec.Word2Vec.load(sys.argv[1]) results = model.most_similar(positive=sys.argv[2], topn=5) for result in results: print(result[0], '\t', result[1])
ということで、1000件の口コミを学習したモデルに対して、公園に関連性が高いキーワードを出してみます。
[vagrant@localhost python]$ python3.6 similarWords.py vector.surface.model 公園 水飲み 0.990000307559967 天然 0.9888129234313965 芝 0.9854303598403931 広大 0.9843466281890869 敷地 0.9831256866455078 芝生 0.9827961921691895 室内 0.9801033139228821 フリー 0.9761441349983215 ラン 0.9746094942092896 ドッグラン 0.9730889797210693
公園から関係性が高い順に表示してみると上位には「水飲み」「天然・芝」「広大」など、公園に係るキーワードが取得されていそうです。
おそらく、てくてくに口コミを投稿してくださったペットオーナーの皆さんが、公園を評価する際に、「ペットが利用できる水飲み場」や「ペットの足に優しい天然芝」であることや「広大なランスペース」があることに関心を寄せているのでしょう。
てくてくのサイト上で、公園を検索する際の条件として「水飲み場あり」や「天然芝」などを用意してあげると利用者の需要を満たせそうだということが判りました。
◇
終わりに
ここまでのご精読、誠にありがとうございました。
私は、分かりやすく説明できるほど機械学習を理解もしていなければ、数学が得意な人間でもないため、機械学習関係の記事にしては、珍しいことにほとんど説明がありません……。
そんな私でも少し調べてライブラリを利用してみるだけで、こんなに面白い結果を出すことができました。
「機械学習に興味はあるけど、どこから何をすれば良いか判らない……」という皆さんも、
「とりあえず動かした!」仲間として、ぜひ一緒に機械学習へと挑戦してみてはいかがでしょうか。