根据输入的语言字符串识别是哪个国家的语言,利用了unicode值,谷歌翻译,百度翻译辅助(重复造轮子系列)。
本项目主要基于shuyo的开源框架 https://github.com/shuyo/language-detection 和谷歌翻译的语言检测接口完成。由于网上很多开源框架或软件都只能识别一种语言,,并且不能检测出字符串中某些语言的占比和语言支持种类都比较少,而我近来有个需求需要识别包含不同种类的语言和求出它们之间的占比,因此开发出这个功能jar包。
-
当前支持同一字符串两种语言的识别,并能求出占比,返回形式:
{"lang1":0.09,"lang2":0.91}
,如果检测不了,则返回{}
-
支持语言种类多,具体支持的语言种类见下表
-
会自动过滤掉特殊非语言字符,如:邮箱,链接,数字,换行符,多余的空格等
-
支持自定义语言库
-
最多只支持两种语言,而且不支持都是字母的多语言识别,例如:法语和英语的混合,这种情况下,会整个字符串进行识别。
-
如果使用精确识别模式,识别速度上比较慢,如果语言大多是非英语字母,则速度大概是1秒一次。
建议使用maven来构建项目
直接使用以下maven依赖
<dependency>
<groupId>com.github.kanlon</groupId>
<artifactId>language-distinguish</artifactId>
<version>1.1.1</version>
</dependency>
下载项目目录下的lib包中的所有jar包,将它们加到需要用到的项目中的jar包中。然后就可以创建以下测试类进行测试了。
-
如果需要自己构造语言库,需要在项目根目录下建一个lang文件夹,并将语言库放到该目录下,否则会默认使用自带的lang语言库。语言库制作参考: https://www.jianshu.com/p/9611a048f970 中的”如何生成Language Profile“
-
然后就可以调用
LanguageDistinguish
类中的静态方法getLanguageByString(String str,DetectMode mode)
来使用了,会返回语言名称的简写代码,str表示要检测的语言,DetectMode表示识别模式DetectMode.PRECISION
表示精确的,不过速度慢,DetectMode.IMPRECISION
表示不太精确的,速度快。
/**
* 测试语言识别
*
* @author zhangcanlong
* @since 2019/1/28 11:13
*/
@Slf4j
public class LanguageDistinguishTest {
/**
* 测试识别
*/
@Test
public void testDistinguish() {
String lang1 = "com.cybozu.labs.langdetect.Detector.getProbabilities";
String lang2 = "尽管每种应用都会有所不同,但是本质上都是相似的,需要比较单独个体的相似性。";
String lang3 = "com.cybozu.labs.langdetect.Detector.getProbabilities尽管每种应用都会有所不同,但是本质上都是相似的,需要比较单独个体的相似性。";
String lang4 = "BTS (방탄소년단) 'Save ME' Official MV\n";
String lang5 = "\"เพลงอื่นๆในอัลบั้ม\n" + "01 Fly : https://www.youtube.com/watch?v=eaIsRux0EUs\n" + "02 Can't (못하겠어) : https://www.youtube.com/watch?v=eduPd3zejwc\n" + "03 See the light (빛이나) : https://www.youtube.com/watch?v=n9O6ZxIiNfo\n" + "04 Fish : https://www.youtube.com/watch?v=q8UdPXzH2qA\n" + "05 Rewind : https://www.youtube.com/watch?v=J9jfoApJous\n" + "06 Beggin on my knees : https://www.youtube.com/watch?v=TOzU28PLjkM\n" + "07 Something good : https://www.youtube.com/watch?v=dtupeRACACc&feature=youtu.be\n" + "\n" + "- - - - - - - - - - - - - - - - - - - - -\n" + "ห้ามรีอัพโหลดและใช้ในเชิงพาณิชย์ [Do not Re-upload & Not for sale]\n" + "- - - - - - - - - - - - - - - - - - - - -\n" + ":: Credit::\n" + "Hangul : music.naver\n" + "Eng trans : KpopViral.com\n" + "Thai lyrics & Trans : BAEBOOIrene\n" + "- - - - - - - - - - - - - - - - - - - - -\n" + "แปลผิดพลาดประการใดขออภัยด้วยนะคะ\n" + "กดไลค์และคอมเมนต์เป็นกำลังใจให้คนทำซับมากมาย\"\n";
String lang6 = "Всем доброго дня! Сегодняшнее видео посвящено автомобилям, которые разгоняется до скорости в 300 и больше! Здесь и Porsche GT2, и Lamborghini Urus и Huracan, Audi R8, Mercedes E63 S, а также Bentley Continental GT! Это уже 3 видео по данной теме, так что если вы не видели первые две подборки, то обязательно посмотрите! Приятного просмотра!\n";
String lang7 = "1--";
String lang8 = "";
log.info("识别1的文本为:{},结果为:{}", lang1, LanguageDistinguish.getLanguageByString(lang1, DetectMode.PRECISION));
log.info("识别2的文本为:{},结果为:{}", lang2, LanguageDistinguish.getLanguageByString(lang2, DetectMode.PRECISION));
log.info("识别3的文本为:{},结果为:{}", lang3, LanguageDistinguish.getLanguageByString(lang3, DetectMode.PRECISION));
log.info("识别4的文本为:{},结果为:{}", lang4, LanguageDistinguish.getLanguageByString(lang4, DetectMode.PRECISION));
log.info("识别5的文本为:{},结果为:{}", lang5, LanguageDistinguish.getLanguageByString(lang5, DetectMode.PRECISION));
log.info("识别6的文本为:{},结果为:{}", lang6, LanguageDistinguish.getLanguageByString(lang6, DetectMode.PRECISION));
//如果检测的字符串不含有特征字符,即识别不了,会返回"{}"
log.info("识别7的文本为:{},结果为:{}", lang7, LanguageDistinguish.getLanguageByString(lang7, DetectMode.PRECISION));
//如果检测的字符串为空,或空字符串,则会抛出异常,因此需要自己判空
try {
log.info("识别8的文本为:{},结果为:{}", lang8, LanguageDistinguish.getLanguageByString(lang8, DetectMode.PRECISION));
} catch (Exception e) {
log.error("这里会抛出空报错!", e);
}
}
}
运行结果
21:30:15,282 INFO LanguageDistinguishTest:30 - 识别1的文本为:com.cybozu.labs.langdetect.Detector.getProbabilities,结果为:{"en":1.00}
21:30:15,287 INFO LanguageDistinguishTest:31 - 识别2的文本为:尽管每种应用都会有所不同,但是本质上都是相似的,需要比较单独个体的相似性。,结果为:{"zh-cn":1.00}
21:30:15,291 INFO LanguageDistinguishTest:32 - 识别3的文本为:com.cybozu.labs.langdetect.Detector.getProbabilities尽管每种应用都会有所不同,但是本质上都是相似的,需要比较单独个体的相似性。,结果为:{"zh-cn":0.60,"en":0.40}
21:30:15,294 INFO LanguageDistinguishTest:33 - 识别4的文本为:BTS (방탄소년단) 'Save ME' Official MV
,结果为:{"ko":0.20,"en":0.80}
21:30:15,298 INFO LanguageDistinguishTest:34 - 识别5的文本为:"เพลงอื่นๆในอัลบั้ม
01 Fly : https://www.youtube.com/watch?v=eaIsRux0EUs
02 Can't (못하겠어) : https://www.youtube.com/watch?v=eduPd3zejwc
03 See the light (빛이나) : https://www.youtube.com/watch?v=n9O6ZxIiNfo
04 Fish : https://www.youtube.com/watch?v=q8UdPXzH2qA
05 Rewind : https://www.youtube.com/watch?v=J9jfoApJous
06 Beggin on my knees : https://www.youtube.com/watch?v=TOzU28PLjkM
07 Something good : https://www.youtube.com/watch?v=dtupeRACACc&feature=youtu.be
- - - - - - - - - - - - - - - - - - - - -
ห้ามรีอัพโหลดและใช้ในเชิงพาณิชย์ [Do not Re-upload & Not for sale]
- - - - - - - - - - - - - - - - - - - - -
:: Credit::
Hangul : music.naver
Eng trans : KpopViral.com
Thai lyrics & Trans : BAEBOOIrene
- - - - - - - - - - - - - - - - - - - - -
แปลผิดพลาดประการใดขออภัยด้วยนะคะ
กดไลค์และคอมเมนต์เป็นกำลังใจให้คนทำซับมากมาย"
,结果为:{"th":0.43,"en":0.57}
21:30:15,301 INFO LanguageDistinguishTest:35 - 识别6的文本为:Всем доброго дня! Сегодняшнее видео посвящено автомобилям, которые разгоняется до скорости в 300 и больше! Здесь и Porsche GT2, и Lamborghini Urus и Huracan, Audi R8, Mercedes E63 S, а также Bentley Continental GT! Это уже 3 видео по данной теме, так что если вы не видели первые две подборки, то обязательно посмотрите! Приятного просмотра!
,结果为:{"ru":0.77,"en":0.23}
21:30:15,302 INFO LanguageDistinguishTest:37 - 识别7的文本为:1--,结果为:{}
21:30:15,302 ERROR LanguageDistinguishTest:42 - 这里会抛出空报错!
java.lang.IllegalArgumentException: 字符串不能为空
at com.kanlon.language.LanguageDistinguish.getLanguageByString(LanguageDistinguish.java:35)
-
先用正则除去特殊字符,多空白字符替换为一个空白字符.
-
然后以空格划分字符串,将含有非字母的字符串和只含有字母的字符串分别归为一类,然后调用shuyo的开源框架(尝试过其他方式,发现该框架识别率最高)分别识别两类字符串,如果识别不了,再调用谷歌翻译识别,再统计占比,然后返回
-
后期还会优化,识别法语,英语,德语,目前准对所给测试字符串的特点,基本能精确识别.
序号 | 语言简写 | 语言名称 |
---|---|---|
1 | af | 布尔语(南非荷兰语) |
2 | am | 阿姆哈拉语 |
3 | an | 阿拉贡语 |
4 | ar | 阿拉伯语 |
5 | ast | 阿斯图里亚斯语 |
6 | az | 阿塞拜疆语 |
7 | be | 白俄罗斯语 |
8 | bg | 保加利亚语 |
9 | bn | 孟加拉语 |
10 | br | 布兰顿语 |
11 | bs | 波斯尼亚语 |
12 | ca | 加泰罗尼亚语 |
13 | ceb | 宿务语 |
14 | co | 科西嘉语 |
15 | cs | 捷克语 |
16 | cy | 威尔士语 |
17 | da | 丹麦语 |
18 | de | 德语 |
19 | el | 希腊语 |
20 | en | 英语 |
21 | eo | 世界语 |
22 | es | 西班牙语 |
23 | et | 爱沙尼亚语 |
24 | eu | 巴斯克语 |
25 | fa | 波斯语 |
26 | fi | 芬兰语 |
27 | fr | 法语 |
28 | fy | 弗里西语 |
29 | ga | 爱尔兰语 |
30 | gd | 苏格兰盖尔语 |
31 | gl | 加利西亚语 |
32 | gu | 古吉拉特语 |
33 | ha | 豪萨语 |
34 | haw | 夏威夷语 |
35 | he | 希伯来语 |
36 | hi | 印地语 |
37 | hmn | 苗语 |
38 | hr | 克罗地亚语 |
39 | ht | 海地克里奥尔语 |
40 | hu | 匈牙利语 |
41 | hy | 亚美尼亚语 |
42 | id | 印尼语 |
43 | ig | 伊博语 |
44 | is | 冰岛语 |
45 | it | 意大利语 |
46 | iw | 希伯来语 |
47 | ja | 日语 |
48 | jw | 印尼爪哇语 |
49 | ka | 格鲁吉亚语 |
50 | kk | 哈萨克语 |
51 | km | 高棉语 |
52 | kn | 卡纳达语 |
53 | ko | 韩语 |
54 | ku | 库尔德语 |
55 | ky | 吉尔吉斯语 |
56 | la | 拉丁语 |
57 | lb | 卢森堡语 |
58 | lo | 老挝语 |
59 | lt | 立陶宛语 |
60 | lv | 拉脱维亚语 |
61 | mg | 马尔加什语 |
62 | mi | 毛利语 |
63 | mk | 马其顿语 |
64 | ml | 马拉雅拉姆语 |
65 | mn | 蒙古语 |
66 | mr | 马拉地语 |
67 | ms | 马来语 |
68 | mt | 马耳他语 |
69 | my | 缅甸语 |
70 | ne | 尼泊尔语 |
71 | nl | 荷兰语 |
72 | no | 挪威语 |
73 | ny | 齐切瓦语 |
74 | oc | 奥克语 |
75 | pa | 旁遮普语 |
76 | pl | 波兰语 |
77 | ps | 普什图语 |
78 | pt | 葡萄牙语 |
79 | ro | 罗马尼亚语 |
80 | ru | 俄语 |
81 | sd | 信德语 |
82 | si | 僧伽罗语 |
83 | sk | 斯洛伐克语 |
84 | sl | 斯洛文尼亚语 |
85 | sm | 萨摩亚语 |
86 | sn | 修纳语 |
87 | so | 索马里语 |
88 | sq | 阿尔巴尼亚语 |
89 | sr | 塞尔维亚语 |
90 | st | 塞索托语 |
91 | su | 印尼巽他语 |
92 | sv | 瑞典语 |
93 | sw | 斯瓦希里语 |
94 | ta | 泰米尔语 |
95 | te | 泰卢固语 |
96 | tg | 塔吉克语 |
97 | th | 泰语 |
98 | tl | 菲律宾语 |
99 | tr | 土耳其语 |
100 | uk | 乌克兰语 |
101 | ur | 乌尔都语 |
102 | uz | 乌兹别克语 |
103 | vi | 越南语 |
104 | wa | 瓦隆语 |
105 | xh | 南非科萨语 |
106 | yi | 意第绪语 |
107 | yo | 约鲁巴语 |
108 | zh-cn | 简体中文 |
109 | zh-tw | 繁体中文 |
110 | zu | 南非祖鲁语 |