文本语言检测之language-detection

2018-03-01 11:12:50来源:https://www.jianshu.com/p/9611a048f970作者:猪叔叔人点击

分享


1、概述


当我们想知道一个字或一个词组是哪一国的语言时,我们可以使用强大的Google Translate检测,比如我们输入“哈哈”,谷歌翻译可以识别到我们输入的文字是中文,如下图




图1.png

我们在Android项目开发时可能会遇到这样的需求,需要识别某些字符串属于什么语言,而且语言识别在做自动化测试时也是很有用的。像华为、魅族、小米这些国内知名的手机厂商,在海外均有销售,所以国际化适配尤其重要。为了提升软件的适配质量,我们往往需要检测应用是否存在漏翻译的情况,检测时需要判断应用里显示的文本是否和当前系统语言一致。然而,网上早已有人开发出这样的语言检测库——(language-detection),language-detection是一个用于语言检测的开源库,可以根据字符串检测出其所属的国家语言,该项目已经在GitHub上开源,项目地址:https://github.com/shuyo/language-detection。


2、使用


该语言检测库使用起来十分方便,只需要引入langdect.jar和jsonnic-1.2.0.jar这两个jar包即可,里面的API接口调用也很简单。


使用之前需要初始化,需要加载语言检测样本文件,检测库会根据这些语言样本文件来匹配目标文本属于哪种国家语言。参数可以是指定的样本文件路径,也可以是存放多个样本文件的目录路径。


/**
* Load profiles from specified directory.
* This method must be called once before language detection.
*
* @param profileDirectory profile directory path
* @throws LangDetectException Can't open profiles(error code = {@link ErrorCode#FileLoadError})
* or profile's format is wrong (error code = {@link ErrorCode#FormatError})
*/
public static void loadProfile(String profileDirectory) throws LangDetectException {
loadProfile(new File(profileDirectory));
}

初始化完成后,可以调用detect方法来检测指定的文本,返回的结果是与该文本最接近的国家语言的名称。


public String detect(String text) throws LangDetectException {
Detector detector = DetectorFactory.create();
detector.append(text);
return detector.detect();
}

检测库会根据你传入的文本去匹配最可能相近的国家语言,因为有些国家语言比较接近(例如法语、西班牙语这些欧洲语言,而且我们中文也分简体中文、香港繁体和台湾繁体),所以返回的结果也不一定完全是正确,当然我们也可以使用以下方法返回可能匹配的国家语言名称集合。


public ArrayList<Language> detectLangs(String text) throws LangDetectException {
Detector detector = DetectorFactory.create();
detector.append(text);
return detector.getProbabilities();
}

3、关于语言样本文件language profile


上面提到该开源库使用前需要初始化语言样本文件language profile,在检测时用到了贝叶斯定理(贝叶斯定理是什么,统计学里的一个定理,然后还是让Google来告诉你吧~),而这些language profile就是我们需要采样的样本库,我们需要根据目标文本的特征和这些样本库对比,最终判断出有多大概率属于这种语言。


目前该开源库只支持50多种语言,但我们可以创建我们需要的其他语言样本文件,这些样本文件可以根据Wikipedia(维基百科)上的abstract文件生成,abstract文件是Wikipedia不定期自动抓取不同国家语言网页文字生成的xml文件。


4、如何生成Language Profile


首先需要从Wikipedia上获取abstract文件,下载链接如下:


https://dumps.wikimedia.org/backup-index.html


该下载页面涵盖了大多数国家语言的abstract文件,从列表中找到对应的链接进入下载即可




图2.png

如果觉得页面内容太多,也可以直接查找对应语言地区的abstract文件,大多数情况可按如下格式查找,


https://dumps.wikimedia.org/XXXwiki
https://dumps.wikimedia.org/XXXwikimedia

xxx大多数情况为语言_地区(如zh_yue),语言(如zh),地区(如tw)。




图3.png

以新西兰英语为例,可从其latest文件夹下查找最新的abstract文件包,如上图的latest文件夹下的nzwikimedia-latest-abstract.xml.gz。也可从其它日期目录查找新西兰英语,如果2017-12-20日期的abstract文件不存在 ,我们可以选择更早的日期中查找abstract文件,如20171201下可找到abstract文件。如下图,查找到nzwiki-20171205-abstract.xml




图4.png

下载完成后解压,把解压的文件改名为(languagecode)wiki-(version)-abstract.xml的格式(例如:nzwiki-20171201-abstract.xml),使用langdetect.jar生成language profile,命令如下:


cd e:
mkdir abstracts
cd abstracts
mkdir profiles
java -jar langdetect.jar --genprofile –d . nz

java –jar命令执行前把langdect.jar和abstract文件拷贝到新建的abstracts目录,新建的profiles目录名字不能随便更改,否则会报错提示找不到指定路径。另外,abstract文件的格式也是固定的,需要按照上述的格式,新西兰英语的abstract文件命名为:nzwiki-20171201-abstract.xml,前面的“nz”是国家语言代号。最终生成的language profile可以在profiles目录里找到,最终生成一个JSON格式的文件,如下图,可按需改名JSON文件名,但要确保文件名与文件内容中的name值相同。




图5.png

最后,由于abstract文件是从wiki网站中相关语言与地区的文章聚合生成的,language profile可能含有其他一些乱码或者其他语言的文字,会影响字库检测的准确率,建议去除生成的文件内容中那些明显的乱码和文字。


参考


https://github.com/shuyo/language-detection/blob/wiki/ProjectHome.md


https://github.com/optimaize/language-detector


https://github.com/optimaize/language-detector/issues/46








最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台