Skip to content

KANLON/language-distinguish

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

language-distinguish(语言识别language-detect)

根据输入的语言字符串识别是哪个国家的语言,利用了unicode值,谷歌翻译,百度翻译辅助(重复造轮子系列)。

项目说明

本项目主要基于shuyo的开源框架 https://github.com/shuyo/language-detection 和谷歌翻译的语言检测接口完成。由于网上很多开源框架或软件都只能识别一种语言,,并且不能检测出字符串中某些语言的占比和语言支持种类都比较少,而我近来有个需求需要识别包含不同种类的语言和求出它们之间的占比,因此开发出这个功能jar包。

特点:

  1. 当前支持同一字符串两种语言的识别,并能求出占比,返回形式:{"lang1":0.09,"lang2":0.91},如果检测不了,则返回{}

  2. 支持语言种类多,具体支持的语言种类见下表

  3. 会自动过滤掉特殊非语言字符,如:邮箱,链接,数字,换行符,多余的空格等

  4. 支持自定义语言库

缺点:

  1. 最多只支持两种语言,而且不支持都是字母的多语言识别,例如:法语和英语的混合,这种情况下,会整个字符串进行识别。

  2. 如果使用精确识别模式,识别速度上比较慢,如果语言大多是非英语字母,则速度大概是1秒一次。

使用说明

建议使用maven来构建项目

安装依赖或添加jar包

方式一(推荐)

直接使用以下maven依赖


<dependency>
    <groupId>com.github.kanlon</groupId>
    <artifactId>language-distinguish</artifactId>
    <version>1.1.1</version>
</dependency>

方式二

下载项目目录下的lib包中的所有jar包,将它们加到需要用到的项目中的jar包中。然后就可以创建以下测试类进行测试了。

自定义配置与使用

  1. 如果需要自己构造语言库,需要在项目根目录下建一个lang文件夹,并将语言库放到该目录下,否则会默认使用自带的lang语言库。语言库制作参考: https://www.jianshu.com/p/9611a048f970 中的”如何生成Language Profile“

  2. 然后就可以调用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)

项目功能搭建思路

  1. 先用正则除去特殊字符,多空白字符替换为一个空白字符.

  2. 然后以空格划分字符串,将含有非字母的字符串和只含有字母的字符串分别归为一类,然后调用shuyo的开源框架(尝试过其他方式,发现该框架识别率最高)分别识别两类字符串,如果识别不了,再调用谷歌翻译识别,再统计占比,然后返回

  3. 后期还会优化,识别法语,英语,德语,目前准对所给测试字符串的特点,基本能精确识别.

支持的语言

序号 语言简写 语言名称
1af布尔语(南非荷兰语)
2am阿姆哈拉语
3an阿拉贡语
4ar阿拉伯语
5ast阿斯图里亚斯语
6az阿塞拜疆语
7be白俄罗斯语
8bg保加利亚语
9bn孟加拉语
10br布兰顿语
11bs波斯尼亚语
12ca加泰罗尼亚语
13ceb宿务语
14co科西嘉语
15cs捷克语
16cy威尔士语
17da丹麦语
18de德语
19el希腊语
20en英语
21eo世界语
22es西班牙语
23et爱沙尼亚语
24eu巴斯克语
25fa波斯语
26fi芬兰语
27fr法语
28fy弗里西语
29ga爱尔兰语
30gd苏格兰盖尔语
31gl加利西亚语
32gu古吉拉特语
33ha豪萨语
34haw夏威夷语
35he希伯来语
36hi印地语
37hmn苗语
38hr克罗地亚语
39ht海地克里奥尔语
40hu匈牙利语
41hy亚美尼亚语
42id印尼语
43ig伊博语
44is冰岛语
45it意大利语
46iw希伯来语
47ja日语
48jw印尼爪哇语
49ka格鲁吉亚语
50kk哈萨克语
51km高棉语
52kn卡纳达语
53ko韩语
54ku库尔德语
55ky吉尔吉斯语
56la拉丁语
57lb卢森堡语
58lo老挝语
59lt立陶宛语
60lv拉脱维亚语
61mg马尔加什语
62mi毛利语
63mk马其顿语
64ml马拉雅拉姆语
65mn蒙古语
66mr马拉地语
67ms马来语
68mt马耳他语
69my缅甸语
70ne尼泊尔语
71nl荷兰语
72no挪威语
73ny齐切瓦语
74oc奥克语
75pa旁遮普语
76pl波兰语
77ps普什图语
78pt葡萄牙语
79ro罗马尼亚语
80ru俄语
81sd信德语
82si僧伽罗语
83sk斯洛伐克语
84sl斯洛文尼亚语
85sm萨摩亚语
86sn修纳语
87so索马里语
88sq阿尔巴尼亚语
89sr塞尔维亚语
90st塞索托语
91su印尼巽他语
92sv瑞典语
93sw斯瓦希里语
94ta泰米尔语
95te泰卢固语
96tg塔吉克语
97th泰语
98tl菲律宾语
99tr土耳其语
100uk乌克兰语
101ur乌尔都语
102uz乌兹别克语
103vi越南语
104wa瓦隆语
105xh南非科萨语
106yi意第绪语
107yo约鲁巴语
108zh-cn简体中文
109zh-tw繁体中文
110zu南非祖鲁语

About

根据输入的语言字符串识别是哪个国家的语言,利用了unicode值,谷歌翻译,百度翻译辅助

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published