簡単! MAMPでgensim、word2vecを使う。


注意! python、mamp、gensimがインストールされた環境の方にむけたものです。できてない方はインストールしてください。
あと、word2vecの学習ではなく、似ている言葉探すだけです。

まず、phpからpythonに接続します。

phpにこれを入れてください〜!
execというコードは、phpからコマンドラインにアクセスできます。(macのターミナルと同じやつ。)


<?php
exec('ls')
?>

これを使って、word2vecが書かれたpythonを実行します。
例えば...、test.pyのようなpythonファイルをphpから実行できます。


<?php
exec('python test.py')
?>

次にword2vecで似ている言葉を探すためにデータを持ってきます。
zipダウンロードしましょう。
http://www.cl.ecei.tohoku.ac.jp/~m-suzuki/jawiki_vector/
これを後で使います。

次にpython側ですが、新しいpythonファイルを作ってください。このように書きます。
これでok〜!
さっきダウンロードしたzipを回答して近くに置いてください。それが「entity_vector/entity_vector.model.bin」です。
(今、日本語でコメントアウトで書いてある部分を消さないと読み込むときエラーが出るので消してください!(多分工夫したら読み取れる。なんかあると思う。))

以下のようにsys.pathでパスを通してあげないと..
「ImportError: No module named 'gensim' 」というエラーが出ます。これはmampの中に設定されてるモジュールを探す場所が違うということです。なのですでにmacの中にインストールされたgensimのパスをターミナルで探しましょう。(pip show gensim)

word2vec.py
# macのターミナルで、pythonでgensim modelsをインポートすることはできるんですが、mamp上にはパスが入ってません。
# なので、sys.pathでパスを入れてあげます。
import sys
sys.path.append('パス')
# 上の「パス」の部分には、次に調べる絶対パスを入力してください。(例:/Users/太郎/anaconda3/lib/python3.6/site-packages)

# 以下word2vecを実行するコード。
# 「graphic」と似ている言葉を探します。
from gensim.models import KeyedVectors
model_dir = 'entity_vector/entity_vector.model.bin'
model = KeyedVectors.load_word2vec_format(model_dir, binary=True)

results = model.similar_by_vector("graphic", topn=10, restrict_vocab=None)

for result in results:
    print(result)

では、phpに戻ります。
先ほどのexec()で、コマンドを実行し、pythonファイルを実行します。
第2引数には、結果が。第3引数には、エラーがあれば何かそれが返ってきます。
これで..結果は..

index.php
$command = 'python wd2vc.py';
exec($command, $output, $return_var);
var_dump($output, $return_var);

いけた〜〜!!
「graphic」と似ている言葉が配列で出力されてます。やったね!

参考記事:
PHP - exec()のエラーハンドリングと標準エラー出力の関係をまとめる
https://qiita.com/smd8122/items/65b552f1d53bfb7fad9a
MAMPのPHPからMecabを使おうとしたら少しハマった話!
https://dbym4820.hatenablog.com/entry/2017/10/18/171259