WindowsからfastTextを使ってみる

参考にさせて頂いたページ
tadaoyamaoka.hatenablog.com

環境

Windows10 pro 64bit
UbuntuWindowsストアからインストール)
Python 3.5.2(Ubuntuに最初からインストールされている)
Perl 5.22.1(Ubuntuに最初からインストールされている)

下準備

  • unzipのインストール
sudo apt-get install unzip
  • pip3のインストール
sudo apt-get install python3-pip
  • 「numpy」「scipy」「gensim」のインストール
sudo pip3 install numpy
sudo pip3 install scipy
sudo pip3 install gensim

fastTextの導入

wget https://github.com/facebookresearch/fastText/archive/v0.1.0.zip
unzip v0.1.0.zip
cd fastText-0.1.0
make

テキストファイルの準備

(注)用意するテキストファイルはUTF-8で。必要に応じて下記を実行。

sudo apt-get install nkf
nkf -w Absts.txt > Absts_utf8.txt

fastTextの実行

./fasttext skipgram -input Absts_utf8.txt -output model

「model.bin」「model.vec」が作成される。

gensimを使って評価

ここからはPythonを使用。
(注)UbuntuPythonを起動する時は「python3」と入力。

from gensim.models.wrappers.fasttext import FastText
model = FastText.load_fasttext_format("model")
model.most_similar("kidney",topn=15)

結果

[('kidney)', 0.9012922048568726), ('renal', 0.8575583696365356), ('kidneys', 0.831729531288147), ('liver', 0.8133635520935059), ('kidneys,', 0.7893050909042358), ('whole-kidney', 0.7847826480865479), ('Kidney', 0.76973557472229), ('hepatorenal', 0.7679615616798401), ('pretransplant', 0.7505965232849121), ('kidney,', 0.7475892305374146), ('kidneys.', 0.7396260499954224), ('nephron', 0.7391433715820312), ('nephrotic', 0.7352806329727173), ('nephrogenic', 0.7335397005081177), ('(liver', 0.7216404676437378)]

あれれ?大文字、小文字の区別がされていない。
かつ「,」「.」「(」「)」などが消去されていない。
テキストファイルを準備する段階でそれらの下処理が必要らしい。

テキストファイルの下処理

Perlを使って行う。stem.plを作成。

while(<>){
    #大文字→小文字
    tr/A-Z/a-z/;
    #記号をスペースに置換
    s/[^\w\s]/ /ig;
    #数字を削除
    s/\b\d+\b//ig;
    print;
}
perl stem.pl Absts_utf8.txt > post_Absts.txt

「CKD(慢性腎臓病)」-「慢性」+「急性」=「AKI(急性腎障害)」

再度fastTextを実行し結果確認。

from gensim.models.wrappers.fasttext import FastText
model = FastText.load_fasttext_format("model")
model.most_similar(positive=["ckd","acute"],negative=["chronic"],topn=3)
[('aki', 0.7763621807098389), ('kidney', 0.7052872180938721), ('renal', 0.6896063089370728)]

感想

たしかに実行は「fast」である。
関係ないが、WindowsストアからインストールできるUbuntuは最高である。

Rから使用する場合(2018/2/19追記)

library(text2vec)

word_vec <- read.table("model.vec", header = F, sep = " ", skip = 1, row.names = 1)
word_vec <- word_vec[,-101]
word_vec <- as.matrix(word_vec)

ckd <- word_vec["ckd",, drop = F]
chronic <- word_vec["chronic",, drop = F]
acute <- word_vec["acute",, drop = F]

answer <- ckd - chronic + acute

cos_sim <- sim2(x = word_vec, y = answer, method = "cosine", norm = "l2")
head(sort(cos_sim[, 1], decreasing = TRUE)[-1], 3)