detectLanguage

按字符占比判定一段文本的主要文字体系。纯统计方式,不加载模型,不加载词典。适合「用哪套分词规则 / 哪个语言专属模型 / 哪种排版度量」这类分支判断。

API

detectLanguage(text, sampleSize?)

参数 说明 类型 默认值
text 待检测文本 string 必填
sampleSize 采样字符数 number 20000

返回 'zh' \| 'ja' \| 'ko' \| 'en' \| 'other'

把浏览器 UI 语言映射到同一套分桶,用作没有内容可检测时的默认值。SSR 下返回 'other'

示例

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. 只采样开头。正文语言全文一致,为了确认第一段就已说明的事去扫一本上百万字的书纯属浪费。
  2. 夹杂少量英文的中文仍判中文。拉丁字符要明显占多(超过 3 倍)才判成英文,因为中文里混英文很常见,反过来少见。
  3. CJK 内部靠假名和谚文来分。光看汉字分不出中文和日文——日文也写汉字。假名可以:日文每个助词、每处词形变化都要用假名,中文完全不用;谚文对韩文起同样作用。只有汉字、没有标记文字的,判为中文——三者之中只有中文是纯汉字书写的。
  4. 引用一个标题不会翻盘。标记文字至少要占 CJK 字符的 5%,所以一篇引了日文片名的中文页面仍判中文。
  5. 这些是披着语言名的文字体系。西班牙文、葡萄牙文、德文都返回 'en'——它们同属拉丁文字,分词和断行的处理一样,而这个函数下游的任何环节都区分不了它们。西里尔、阿拉伯文、泰文和纯数字文本落在 'other'。这是粗粒度的文字体系分桶,不是语种识别。