~/blog/language-detection-of-natural-language-text-using-fasttext
Published on

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

3037文字6分で読めます–––
閲覧数
Authors
  • avatar
    Name
    Shou Arisaka nyapp.buzz/shou
    short bio
    Z世代の情報技術者。Next.jsで自作SNSを個人開発中。

Pythonの機械学習(ディープラーニング)を活用した自然言語処理・自然言語認識ライブラリ"fastText"を使用し、言語や外国語が一体何語なのかを自動認識します。

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 

avatar

Shou Arisaka

情報技術者 / Z世代プログラマー / SaaSアプリやSNSを開発
今すぐ話そう!

15歳でWordPressサイトを立ち上げ、ウェブ領域に足を踏み入れる。翌年にはRuby on Railsを用いたマイクロサービス開発に着手し、現在はデジタル庁を支えたNext.jsによるHP作成やSaaS開発のプロジェクトに携わりながら、React.js・Node.js・TypeScriptによるモダンなウェブアプリの個人開発を趣味でも行う。
フロントエンドからバックエンドまで一貫したアジャイルなフルスタック開発を得意とし、ウェブマーケティングや広告デザインも必要に応じて担当、広告運用・SEO対策・データ分析まで行う低コストかつ高品質な顧客体験の提供が好評。
国内外から200万人を超える人々に支えられ、9周年を迎えるITブログ「yuipro」の開発者、デザイナーでありライター。現在ベータ段階の自作SNS「nyapp.buzz」を日本一の国産SNSとするべく奮闘中。

Created with Fabric.js 5.2.4 何かご質問がありますか?