はじめに
botの入力制限に特定の言語のみを受け取りたいという要望があったので、それを実現する手法の1つとしてpycld3というライブラリで検証してみようと思います。
この記事でやること
- 文章からpyclda3を用いて言語コードを取得する
実装
まずはライブラリのインストールから行います。
詳しくはこちらを確認してください。
pythonのバージョンは以下のように指定されているので今回は python=3.8
の環境で実装しました。
Requires: Python >2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*
余談ですが、python3.- ~ 3.5ではpycld2という別のライブラリが使えるようでした。
pip install pycld3
このライブラリはcld3
という名前でimportできます。
import cld3
次に今回判別に使う仮データを用意します。
samples = {
'月が綺麗ですね' : 'ja', # 日本語
'The moon is beautiful.' : 'en', # 英語
'La lune est belle' : 'fr', # フランス語
'La luna è bellissima' : 'it', # イタリア語
'月が綺麗ですね The moon is beautiful' : 'ja + en',
'月が綺麗ですね La lune est belle' : 'ja + fr',
'月が綺麗ですね La lune è bellissima' : 'ja + it',
'月が綺麗ですね The moon is beautiful La lune est belle La lune est belle La luna è bellissima' : 'mixed',
}
今回は日本語、英語、フランス語、イタリア語の4カ国議+複数の言語の結合文字列で実験しました。
for k, v in samples.items():
lang = cld3.get_frequent_languages(k, num_langs = 1)[0][0]
print(f'入力言語{v} : 検出された言語{lang}')
コードの全体像はこちらになります。
import cld3
samples = {
'月が綺麗ですね' : 'ja', # 日本語
'The moon is beautiful.' : 'en', # 英語
'La lune est belle' : 'fr', # フランス語
'La luna è bellissima' : 'it', # イタリア語
'月が綺麗ですね The moon is beautiful' : 'ja + en',
'月が綺麗ですね La lune est belle' : 'ja + fr',
'月が綺麗ですね La lune è bellissima' : 'ja + it',
'月が綺麗ですね The moon is beautiful La lune est belle La lune est belle La luna è bellissima' : 'mixed',
}
for k, v in samples.items():
lang = cld3.get_frequent_languages(k, num_langs = 1)[0][0]
print(f'入力言語{v} : 検出された言語{lang}')
実行結果と考察
入力言語ja : 検出された言語ja
入力言語en : 検出された言語en
入力言語fr : 検出された言語fr
入力言語it : 検出された言語co
入力言語ja + en : 検出された言語en
入力言語ja + fr : 検出された言語ja
入力言語ja + it : 検出された言語it
入力言語mixed : 検出された言語fy
表にまとめると以下のようになります。
入力言語 | 検出言語 | 正誤 |
---|---|---|
日本語 | 日本語 | O |
英語 | 英語 | O |
フランス語 | フランス語 | O |
イタリア語 | コルシカ語 | X |
日本語+英語 | 英語 | - |
日本語+フランス語 | 日本語 | - |
日本語+イタリア語 | イタリア語 | - |
全文章結合 | フリジア語 | - |
興味深い点としては、単一言語で検出ではコルシカ語と検出されたイタリア語が、日本語+イタリア語の混合文章ではイタリア語として検出されているということかなともいました。
また、今回は短い文章に対して検出を行ったのでより長い文章にすることで各言語ごとの差がつき、より正しい検出になることができそうな気もしました。
まとめ
完全な精度でないですが、単一の言語認識において英語かそうでないかを判別するという、大元の要件はこのライブラリで満たすことができそうなので、一定利用しやすいライブラリなのかと思います!
ぜひ、皆さんも使ってみてください!!!