参考にさせて頂いたページ
tadaoyamaoka.hatenablog.com
- 環境
- 下準備
- fastTextの導入
- テキストファイルの準備
- fastTextの実行
- gensimを使って評価
- 結果
- テキストファイルの下処理
- 「CKD(慢性腎臓病)」-「慢性」+「急性」=「AKI(急性腎障害)」
- 感想
- Rから使用する場合(2018/2/19追記)
環境
Windows10 pro 64bit
Ubuntu(Windowsストアからインストール)
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を使用。
(注)UbuntuでPythonを起動する時は「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)]
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)