Skip to content

detectLanguage

文字の割合から、その文章の主たる文字体系を決めます。純粋な統計であって、モデルも辞書も使いません。「どのトークナイザーか / どの言語向けのモデルか / どの組版の寸法か」を分岐するのに使ってください。

API

detectLanguage(text, sampleSize?)

パラメーター説明既定値
text調べる文章string必須
sampleSize標本として見る文字数number20000

'zh' \| 'ja' \| 'ko' \| 'en' \| 'other' を返します。

ブラウザーの UI の言語を、同じ区分に写したものです。調べる内容がないときの既定値になります。SSR では 'other' を返します。

使用例

js
import { detectLanguage, navigatorLanguage } from 'ranuts';

const lang = book.content ? detectLanguage(book.content) : navigatorLanguage();
const model = { zh: 'title-zh-v1', ja: 'title-ja-v1', ko: 'title-ko-v1', en: 'title-en-v1' }[lang];

補足

  1. 先頭だけを標本にします。 文章の言語は全体を通じて一貫しています。最初の段落がすでに教えてくれることを知るために、100 万字の本を走査するのは無駄です。
  2. 英語が少し混じった中国語は、中国語のままです。 判定が英語へ傾くには、ラテン文字がはっきり優勢(3 倍を超える)でなければなりません。中国語に英語を混ぜるのはよくあることで、逆はそうではありません。
  3. CJK の中を分けるのは、かなとハングルです。 漢字だけでは中国語と日本語を分けられません。日本語も漢字を書くからです。かなであれば分けられます。日本語は助詞にも活用にもかなを使い、中国語はまったく使いません。韓国語ではハングルが同じ役目を果たします。標識になる文字がなく漢字だけなら中国語と読みます。三つのうち漢字だけで書かれるのは中国語だけだからです。
  4. 題名をひとつ引用したくらいでは判定は覆りません。 標識の文字が CJK の文字の 5% 以上を占めて初めて効きます。日本映画の題名を引いた中国語のページは、中国語のままです。
  5. これは言語の名を借りた文字体系です。 スペイン語もポルトガル語もドイツ語も 'en' を返します。同じラテン文字であり、求める分かち書きも行分割も同じで、この関数より下流のどこにもそれらを区別する手立てはありません。キリル文字、アラビア文字、タイ文字、数字だけの文章は 'other' に入ります。粗い文字体系の分類であって、言語の同定ではありません。

MIT ライセンスのもとで公開されています。