プログラミング

自然言語テキストが何語なのか判定する [fastText]

投稿日:

fastTextというツールを使用して、テキストの言語が日本語なのか中国語なのか英語なのかフランス語なのか、何語なのかを判定します。

fastText/language-identification.md at master · facebookresearch/fastText
facebookresearch/fastText: Library for fast text representation and classification.
Language detection · Issue #878 · facebookresearch/fastText

https://yuis.xsrv.jp/data/KSCpm0aazuAqkyw4deeBN647FKfeZ8NS.png

こんな感じにできます。
“hola”はスペイン語なんですが、英語になってるところが気になりますね。まぁ英語圏(主にアメリカ)の人たちは普段から「サルード!」とか言って盛り上がってますからそれくらい日常語ということなんでしょうか。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_f250a5de-92f4-44f2-8e8c-ab57f168ea4d.gif

pythonのためのインストール

git clone https://github.com/facebookresearch/fastText.git
cd fastText
pip install .  # sudo pip install . 

一応他のインストール方法

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

./fasttext 

データセットのダウンロード

wget https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin

Pythonスクリプト

# coding:utf-8

import fasttext
import json 

# model = fasttext.load_model("/home/yuis/pg/python/fastText/lid.176.bin") 
model = fasttext.load_model("/mnt/c/pg/python/fasttext/lid.176.bin") 

def predict_language(text, model, k=1):
  label, prob = model.predict(text, k)
  return list(zip([l.replace("__label__", "") for l in label], prob))

print( json.dumps(predict_language(u'{{text}}', model, k=2)) )

サンプル

print( json.dumps(predict_language(u'こんにちは', model, k=2)) )
print( json.dumps(predict_language(u'hello', model, k=2)) )
print( json.dumps(predict_language(u'Zürich', model, k=2)) )

Bash関数 (ご自由にお使いください)

predict_language(){

  : <<<'
  e.g. predict_language "hello"
  e.g. predict_language "こんにちは"
  '

export TEXT="${1}"

cat << 'EOT' | mo > "$PGDIR/python/fasttext/predict_language.py"
# coding:utf-8

import fasttext
import json 

# model = fasttext.load_model("/home/yuis/pg/python/fastText/lid.176.bin") 
model = fasttext.load_model("/mnt/c/pg/python/fasttext/lid.176.bin") 

def predict_language(text, model, k=1):
  label, prob = model.predict(text, k)
  return list(zip([l.replace("__label__", "") for l in label], prob))

print( json.dumps(predict_language(u'{{TEXT}}', model, k=2)) )
EOT

# python "$PGDIR/python/fasttext/predict_language.py" | parsejson "[0][0]"
python "$PGDIR/python/fasttext/predict_language.py" 

}

: ショートハンド 
predict_language "hello" 
predict_language "こんにちは" 
predict_language "你好" 
predict_language "hola" 
predict_language "Zürich" 

: jsonパース 
predict_language "hello" | parsejson "[0][0]"
predict_language "こんにちは" | parsejson "[0][0]"

: 使用例 
if [[ "$( predict_language "hello" | parsejson "[0][0]" )" == "en" ]]; then echo "この言語は英語です。" ; fi 
if [[ "$( predict_language "hello" | parsejson "[0][0]" )" == "ja" ]]; then echo "この言語は日本語です。" ; fi