プログラミング

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

Pythonの機械学習(ディープラーニング)を活用した自然言語処理・自然言語認識ライブラリ”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 

関連記事:

Imagededupで類似画像を抽出、検出する(Python)
Pythonのバージョン管理をする方法とpyenvの使い方
Pycharmの有料版を無料でインストールするには

関連広告:

データサイエンスコース by テックアカデミー
AI(人工知能)コース by テックアカデミー
Pythonコース by テックアカデミー
ディープラーニング・機械学習コース by Udemy
Pythonコース by Udemy

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です