Help us understand the problem. What is going on with this article?

Doc2Vecを使用するまでの環境構築手順

More than 1 year has passed since last update.

はじめに

この記事は、CentOS 7.3でDoc2Vec(gensim)を使うまでの流れのメモです。
私が途中かなりハマったので、参考になれば幸いです。
だいぶ忘れてしまったところもありますがご了承ください……

また、スムーズにインストールできるように、自分がインストールした時の手順とは変更しています。そのため、ライブラリ依存によるエラーは発生しないようになっているはずです。

間違っていたらご指摘いただけるとうれしいです。

本記事での目標

  • Python・JUMAN++・KNP・gensimでDoc2Vecを使うための環境構築
  • 似た記事を抽出するサンプルプログラムの作成

環境

key value
OS CentOS Linux release 7.3
shell zsh 5.0
C++ compiler gcc バージョン 4.8.5 20150623

※bash使っているなら、.zshrcを.bash_profileとかに置き換えていただければと思います。

インストールするもの

インストール内容

Python3・pip

console
# Python3が入っているリポジトリを登録
sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
# バージョン確認
yum search python36

# 必要と思われるものをインストール
sudo yum install -y python36 python36u python36u-libs python36u-devel python36u-pip
python3 -V

# シンボリックリンクがツリーっぽい形式になっている(python→python2→python2.7, python3→python3.6)
# デフォルトでは`python`はバージョン2にリンクしているため、バージョン3に変更したいが、yumが使用できなくなるためやらない
#ln -snf /usr/bin/python3 /usr/bin/python

# バージョン確認
python3 -V
# python -m がいらない場合もある
python3 -m pip -V

gensim

console
sudo python3 -m pip install --upgrade gensim

Boost(C++ライブラリ)

console
# 環境変数設定
echo 'export CPLUS_INCLUDE_PATH=$HOME/boost_1_64_0/include:$CPLUS_INCLUDE_PATH' >> .zshrc
echo 'export LD_LIBRARY_PATH=$HOME/boost_1_64_0/lib' >> .zshrc
## マイナーバージョンは固定しない
echo 'export PYTHONPATH=/usr/bin/python3' >> .zshrc
source .zshrc

# ※自分の環境では下記のようにwgetやcurlでは取得できなかった(404)ため、自端末(Windows)よりアップロード
# バージョン注意
curl 'https://dl.bintray.com/boostorg/release/1.64.0/source/:boost_1_64_0.tar.gz' > boost_1_64_0.tar.gz
tar xvzf boost_1_64_0.tar.gz
cd boost_1_64_0

./bootstrap.sh
# お好きなインストール先を指定
# ただし、/usr/bin以下は公式にて非推奨
# -jはCPU数+1が公式推奨
./b2 install -j2 --prefix=$HOME/boost_1_64_0 cxxflags="-std=c++11"

JUMAN++(日本語形態素解析システム)

console
wget http://lotus.kuee.kyoto-u.ac.jp/nl-resource/jumanpp/jumanpp-1.01.tar.xz
tar xvzf jumanpp-1.01.tar.xz
cd jumanpp-1.01

./configure
make
sudo make install

# ライブラリの場所を登録
echo "include /usr/local/lib" >> /etc/ld.so.conf
sudo ldconfig

# パスを通す
cd ~
echo 'export PATH="${PATH}:/usr/local/lib"' >> .zshrc
source .zshrc

# バージョン確認
jumanpp -v

# 動作確認(数秒かかる)
echo "jumanppの動作確認" | jumanpp 

JUMAN(同上)

console
curl http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/juman/juman-7.01.tar.bz2&name=juman-7.01.tar.bz2 > juman-7.01.tar.bz2
tar xvf juman-7.01.tar.bz2
cd juman-7.01

./configure
make
sudo make install

# バージョン確認
juman -v

KNP(日本語等解析システム)

console
curl http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/knp/knp-4.17.tar.bz2&name=knp-4.17.tar.bz2 > knp-4.17.tar.bz2
tar xvf knp-4.17.tar.bz2
cd knp-4.17

# (オプションの指定はしていたか不明です……)
./configure --with-juman-prefix=/usr/local/juman
make
sudo make install

# JUMAN++とKNPの動作確認(数秒かかる)
echo "knpとjumanの動作確認" | jumanpp | knp

PyKNP(KNPのPythonバインディング)

console
tar xvzf pyknp-0.3.tar.gz
cd pyknp-0.3

sudo python3 setup.py install

Doc2Vecの使用

事前準備

console
mkdir data
cd data
# 学習用データのダウンロード
wget http://www.rondhuit.com/download/ldcc-20140209.tar.gz
tar xvfz ldcc-20140209.tar.gz
ls -p # → ldcc-20140209.tar.gz text/
cd ..

サンプルプログラム

Doc2Vecの仕組みとgensimを使った文書類似度算出チュートリアル」のソースを参考にしました。

main.py
import sys
from os import listdir, path
from pyknp import Jumanpp
from gensim import models
from gensim.models.doc2vec import LabeledSentence


path_list = ["data/text/topic-news/topic-news-6903190.txt", "data/text/topic-news/topic-news-6907153.txt", "data/text/topic-news/topic-news-6909425.txt"]

def read_file(filepath):
    with open(filepath, "r") as f:
        return f.read()

def read_documents(paths):
    return [read_file(path) for path in paths]

def split_into_words_list(documents):
    for document in documents:
        applied_jumanpp = Jumanpp().analysis(document)
        yield [mrph.midasi for mrph in applied_jumanpp.mrph_list()]

def corpuses_to_sentences(splited_documents, path_list):
    for index, (text, path) in enumerate(zip(splited_documents, path_list)):
        print("preprocess {}", index)
        yield LabeledSentence(words=text, tags=[path])

def train_model(model, sentences, count):
    for epoch in range(count):
        model.train(sentences, total_examples=model.corpus_count, epochs=model.iter)
        model.alpha -= (0.025 - 0.0001) / 19
        model.min_alpha = model.alpha


if __name__ == '__main__':
    # データ作成
    documents = read_documents(path_list)
    splited_documents = split_into_words_list(documents)
    sentences = corpuses_to_sentences(splited_documents, path_list)

    # モデル作成
    model = models.Doc2Vec(sentences, dm=0, size=300, window=15, alpha=0.025, min_alpha=0.025, min_count=1, sample=1e-6, iter=1)

    # トレーニング
    train_model(model, sentences, 20)

    # モデルのファイル書き出し
    model.save("doc2vec.model")

実行

console
python3 main.py

# REPLで確認
python3
>> from gensim import models
>> model = models.Doc2Vec.load("doc2vec.model")
>> model.docvecs.most_similar("data/text/topic-news/topic-news-6903190.txt", topn=1)
# → [('data/text/topic-news/topic-news-6907153.txt', 0.0052252281457185745)]

補足

ダウンロードしたデータすべて(7,000ちょい)を学習した際には数十分かかりました。

発生したエラーと解決方法

  1. pyconfig.h: そのようなファイルやディレクトリはありません
    • export PYTHONPATH=[Pythonインストール先]を.zshrcに書いてsource .zshrc
  2. Boostがインストールされていない。(エラーメッセージは失念、わかりやすい英語だった記憶。)
    • Boostをインストールする
  3. juman.h: not found.
    • JUMAN++の他にJUMANをインストールする
  4. REPLでのmodel.docvecs.most_similar呼び出し時、下記のエラーメッセージが出力される。
    • model.docvecs.most_similarの第一引数の文字列に、ソース内で使用しているパスと同じ文字列を指定する。
      • (タグとして使用しているため、完全一致でないといけないっぽい。yield LabeledSentence(words=text, tags=[path])の箇所。)
エラーメッセージ
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python3.6/site-packages/gensim/models/doc2vec.py", line 461, in most_similar
    elif doc in self.doctags or doc < self.count:
TypeError: '<' not supported between instances of 'str' and 'int'

おわりに

意外に必要なライブラリが多く、時間がかかりました。今後のアップデートで変更されるかもしれませんが、とりあえず導入部分だけでも躓かないように、この記事を参考にしていただけたら幸いです。

参考ページ

  1. Doc2Vecの仕組みとgensimを使った文書類似度算出チュートリアル
  2. livedoor ニュースコーパス
  3. Python 3 を CentOS 7 に yum でインストールする手順
  4. Ubuntu 日本語形態素解析システムJUMANのインストール方法
  5. JUMAN++をPythonから使う
  6. CentOS 6.0 gcc 4.7.2にBoost 1.5.0をインストール
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした