python实现多语言语种识别_用Python进行语言检测

最近正好碰到这个需求,总结一下用Python进行语言检测的方法。

1.用unicode编码检测

汉字、韩文、日文等都有对应的unicode字符集范围,只要用正则表达式匹配出来即可。

在判断的时候,往往需要去掉一些特殊字符,例如中英文标点符号。可以用下列方法去除:

# 方法一,自定义需要去掉的标点符号,注意这个字符串的首尾出现的[]不是标点符号'[]',

# 而是正则表达式中的中括号,表示定义匹配的字符范围

remove_nota = u'[’·°–!"#$%&\'()*+,-./:;<=>?@,。?★、…【】()《》?“”‘’![\\]^_`{|}~]+'

sentence = '测试。,[].?'

print(re.sub(remove_nota, '', sentence))

# 方法二,只能去掉英文标点符号

remove_punctuation_map = dict((ord(char), None) for char in string.punctuation)

print(sentence.translate(remove_punctuation_map))

输出:

测试

测试。,

还可以把数字也去掉:

# 方法一

sentence = re.sub('[0-9]', '', sentence).strip()

# 方法二

remove_digits = str.maketrans('', '', string.digits)

sentence = sentence.translate(remove_digits)

然后就可以进行语言检测了。

这里的思路是匹配句子的相应语言字符,然后替换掉,如果替换后字符串为空,表示这个句子是纯正的该语言(即不掺杂其它语言)。

也可以用正则表达式查询出句子中属于该语言的字符

s = "English Test"

re_words = re.compile(u"[a-zA-Z]")

res = re.findall(re_words, s) # 查询出所有的匹配字符串

print(res)

res2 = re.sub('[a-zA-Z]', '', s).strip()

print(res2) # 空字符串

if len(res2) <= 0:

print("This is English")

输出:

['E', 'n', 'g', 'l', 'i', 's', 'h', 'T', 'e', 's', 't']

This is English

匹配英文用u"[a-zA-Z]"

中文用u"[\u4e00-\u9fa5]+"

韩文用u"[\uac00-\ud7ff]+"

日文用u"[\u30a0-\u30ff\u3040-\u309f]+" (包括平假名和片假名)

如果想只保留需要的内容,比如保留中英文及数字:

# 只保留中文、英文、数字(会去掉法语德语韩语日语等)

rule = re.compile(u"[^a-zA-Z0-9\u4e00-\u9fa5]")

sentence = rule.sub('', sentence)

完整代码:

import re

import string

remove_nota = u'[’·°–!"#$%&\'()*+,-./:;<=>?@,。?★、…【】()《》?“”‘’![\\]^_`{|}~]+'

remove_punctuation_map = dict((ord(char), None) for char in string.punctuation)

def filter_str(sentence):

sentence = re.sub(remove_nota, '', sentence)

sentence = sentence.translate(remove_punctuation_map)

return sentence.strip()

# 判断中日韩英

def judge_language(s):

# s = unicode(s) # python2需要将字符串转换为unicode编码,python3不需要

s = filter_str(s)

result = []

s = re.sub('[0-9]', '', s).strip()

# unicode english

re_words = re.compile(u"[a-zA-Z]")

res = re.findall(re_words, s) # 查询出所有的匹配字符串

res2 = re.sub('[a-zA-Z]', '', s).strip()

if len(res) > 0:

result.append('en')

if len(res2) <= 0:

return 'en'

# unicode chinese

re_words = re.compile(u"[\u4e00-\u9fa5]+")

res = re.findall(re_words, s) # 查询出所有的匹配字符串

res2 = re.sub(u"[\u4e00-\u9fa5]+", '', s).strip()

if len(res) > 0:

result.append('zh')

if len(res2) <= 0:

return 'zh'

# unicode korean

re_words = re.compile(u"[\uac00-\ud7ff]+")

res = re.findall(re_words, s) # 查询出所有的匹配字符串

res2 = re.sub(u"[\uac00-\ud7ff]+", '', s).strip()

if len(res) > 0:

result.append('ko')

if len(res2) <= 0:

return 'ko'

# unicode japanese katakana and unicode japanese hiragana

re_words = re.compile(u"[\u30a0-\u30ff\u3040-\u309f]+")

res = re.findall(re_words, s) # 查询出所有的匹配字符串

res2 = re.sub(u"[\u30a0-\u30ff\u3040-\u309f]+", '', s).strip()

if len(res) > 0:

result.append('ja')

if len(res2) <= 0:

return 'ja'

return ','.join(result)

这里的judge_language函数实现的功能是:针对一个字符串,返回其所属语种,如果存在多种语言,则返回多种语种(只能检测出中日英韩)

测试一下效果:

s1 = "汉语是世界上最优美的语言,正则表达式是一个很有用的工具"

s2 = "正規表現は非常に役に立つツールテキストを操作することです"

s3 = "あアいイうウえエおオ"

s4 = "정규 표현식은 매우 유용한 도구 텍스트를 조작하는 것입니다"

s5 = "Regular expression is a powerful tool for manipulating text."

s6 = "Regular expression 正则表达式 あアいイうウえエおオ 정규 표현식은"

print(judge_language(s1))

print(judge_language(s2))

print(judge_language(s3))

print(judge_language(s4))

print(judge_language(s5))

print(judge_language(s6))

输出:

zh

zh,ja

ja

ko

en

en,zh,ko,ja

因为s2中包括了汉字,所以输出结果中有zh。

2.用工具包检测

(1)langdetect

from langdetect import detect

from langdetect import detect_langs

s1 = "汉语是世界上最优美的语言,正则表达式是一个很有用的工具"

s2 = "正規表現は非常に役に立つツールテキストを操作することです"

s3 = "あアいイうウえエおオ"

s4 = "정규 표현식은 매우 유용한 도구 텍스트를 조작하는 것입니다"

s5 = "Regular expression is a powerful tool for manipulating text."

s6 = "Regular expression 正则表达式 あアいイうウえエおオ 정규 표현식은"

print(detect(s1))

print(detect(s2))

print(detect(s3))

print(detect(s4))

print(detect(s5))

print(detect(s6)) # detect()输出探测出的语言类型

print(detect_langs(s6)) # detect_langs()输出探测出的所有语言类型及其所占的比例

输出:

zh-cn

ja

ja

ko

en

ca # 加泰隆语

[ca:0.7142837837746273, ja:0.2857136751343887]

emmm...最后一句话识别的不准

(2)langid

import langid

s1 = "汉语是世界上最优美的语言,正则表达式是一个很有用的工具"

s2 = "正規表現は非常に役に立つツールテキストを操作することです"

s3 = "あアいイうウえエおオ"

s4 = "정규 표현식은 매우 유용한 도구 텍스트를 조작하는 것입니다"

s5 = "Regular expression is a powerful tool for manipulating text."

s6 = "Regular expression 正则表达式 あアいイうウえエおオ 정규 표현식은"

print(langid.classify(s1))

print(langid.classify(s2))

print(langid.classify(s3))

print(langid.classify(s4))

print(langid.classify(s5))

print(langid.classify(s6))

# langid.classify(s6)输出探测出的语言类型及其confidence score,

# 其confidence score计算方式方法见:https://jblevins.org/log/log-sum-exp

输出:

('zh', -370.64875650405884)

('ja', -668.9920794963837)

('ja', -213.35927987098694)

('ko', -494.80780935287476)

('en', -56.482327461242676)

('ja', -502.3459689617157)

两个包都把最后一句话识别成了英文,他们给出的结果都是ISO 639-1标准的语言代码。

再来看几个其他语言的例子:

s = "ру́сский язы́к" # Russian

print(detect(s))

print(langid.classify(s))

s = " " # Arabic

print(detect(s))

print(langid.classify(s))

s = "bonjour" # French

print(detect(s))

print(langid.classify(s))

输出:

ru

('ru', -194.25553131103516)

ar

('ar', -72.63771915435791)

hr # 克罗地亚语

('en', -22.992373943328857)

法语没判断出来。langdetect的判断结果依旧比较离谱...

没事可以多玩玩这两个包,O(∩_∩)O哈哈~

参考资料:

欢迎关注我的微信公众号~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vestacp 远程mysql_免费使用VestaCP控制面板的文件管理器 | 雷雨博客

VestaCP是由俄罗斯人编写的免费虚拟主机控制面板&#xff0c;该面板功能强大&#xff0c;即可自用也可对接WHMCS销售。不过面板并不支持免费的文件管理&#xff0c;官网的商业项目为 “File Manager”(月付3刀&#xff0c;终身50刀)及“SFTP Chroot”(月付1刀&#xff0c;终身1…

千寻位置 开发demo_java程序开发,使用javaagent无侵入代码方式,监控方法执行耗时...

背景描述javaagent是在JDK5之后提供的新特性&#xff0c;也可以叫java代理。开发者通过这种机制(Instrumentation)可以在加载class文件之前修改方法的字节码(此时字节码尚未加入JVM)&#xff0c;动态更改类方法实现AOP&#xff0c;提供监控服务如&#xff1b;方法调用时长、可用…

java jpg结构_Java Class 字节码文件结构分析----附带逐字节码分析图

欢迎访问我的博客&#xff0c;同步更新: 枫山别院 今天给大家分享下Java Class字节码文件的结构解析。(文末附有详细大图)代码首先我们创建一个Java类&#xff0c;然后添加一些成员变量和方法&#xff0c;如下:public class Test {String name "hello";int size 10…

泊松分布的分布函数_《可靠性设计》——常用的概率分布

超几何分布&#xff1a;在总数为N、不合格品率为p的一批产品中随机抽取n个样品&#xff0c;且样品中r个不合格品的概率为则称x服从超几何分布。 当N很大时&#xff0c;上式计算相当烦琐&#xff0c;此时可以用二项分布或泊松分布来近似。二项分布&#xff1a;二项分布又称为Ber…

java jvm性能调优_《Java 底层原理》Jvm性能调优

前言Java 的性能调优&#xff0c;主要就是为了防止出现out of memory(oom)。Java出现oom就会直接导致程序停止运行。调优模拟元空间oom的情况importnet.sf.cglib.proxy.Enhancer;importnet.sf.cglib.proxy.MethodInterceptor;importnet.sf.cglib.proxy.MethodProxy;importjava.…

yota3墨水屏设置_汉阳环卫工节前给道路隔音屏“洗澡”

楚天都市报9月27日讯(记者卢成汉 通讯员肖赟 肖利)据了解&#xff0c;三环线汉阳段连接硚口区和经济技术开发区&#xff0c;是货运主通道和入城环路&#xff0c;墨水湖北路二环线延长线高架是二环线汉阳中心城区与三环线的重要连接道&#xff0c;都属“城市快速路”&#xff0c…

java atd_Java字符串String详解

1、String字符串实例化String对象&#xff1a;(1)直接赋值&#xff0c;如&#xff1a;String str"hello";(2)使用关键字 new&#xff0c;如&#xff1a;String strnew String("hello");由图可知&#xff1a;使用 new 的方式在堆内存中开辟了两个空间&#…

while用法_语法宝典:连词while的四种用法,你都学会了吗?

你可能知道while除了表示“当……的时候”&#xff0c;还有它与when, as的用法区别&#xff0c;但是这些还不够全面&#xff0c;今天小编就来给大家详细解析一下相关的用法&#xff0c;一起来看看吧&#xff01;一、考查表示时间的用法&#xff0c;其意为“当……的时候”。如&…

java基础语法试题_java基础语法测试题

java基础语法测试题 Java 程序设计:07-07考试时间&#xff1a;90 分钟用户&#xff1a;wanggang 难度&#xff1a;0 总分&#xff1a;100导出时间&#xff1a;2011-07-07 13:06:15一、判断题(每题 2 分&#xff0c;总分 20 分)1.( )接口和类一样也可以有继承关系&#xff0c;而…

开发转测试没人要_新人如何快速的进入融入软件测试行业?

古人云“师傅领进门&#xff0c;修行在各人”任何行业的入门门槛都是不一样的&#xff0c;软件测试行业涉及到专业领域的知识&#xff0c;入门的门槛高吗&#xff1f;怎么更好的融入行业呢&#xff1f;首先要说到的是软件测试学习的途径主要就三种&#xff0c;一种自学&#xf…

winform checkbox要点击两次_这个Winform的UI库也太全了!四十多个控件都在这一个项目里了...

之前 Gitee 为大家介绍过几款优质的 Winform 项目&#xff1a;这几个WinForm项目&#xff0c;让你更熟悉 .NET&#xff5c;Gitee 项目推荐&#xff0c;发现Winform在大家心中的地位还是挺高的&#xff0c;那么今天就再给各位分享一款新鲜出炉的 Winform UI库——SunnyUI&#x…

java面向对象结课总结_java面向对象课程总结

前言&#xff1a;从大一下学期接触java面向对象课程&#xff0c;到现在java面向对象课程也是告了一段落&#xff0c;到这一阶段我也学了java的大部分的知识&#xff0c;基本的我大概已经懂了&#xff0c;但是在学习java面向对象这个课程中也积累了很多学习java的经验&#xff0…

苹果ppt_你的PPT太low了,学学苹果吧

人在职场哪能不会PPT&#xff0c;可是辛苦做好的PPT总要换来一句&#xff1a;“好low啊&#xff0c;能不能高大上一点&#xff1f;学学人家苹果员工的工作汇报或者发布会PPT吧&#xff01;”这个时候你心里肯定要吐槽一句&#xff1a;“天&#xff01;我要是PPT能做成苹果风&am…

webservice 服务器无法处理请求_Message Queue与WebService比较

最近在使用IBM Websphere Message Queue,与WebService相比&#xff0c;同样是跨平台的通信方式&#xff0c;那么各种有什么优势呢&#xff1f;Message Queue属于比较重量级的应用&#xff0c;在规范化的企业流程中用的比较多。如果企业有很多部门&#xff0c;部门都有自己的系统…

小程序 字号设置 slider滚动改变大小_SteerMouse for mac(鼠标设置工具) v5.4.3

Steermouse Mac版这是一款Mac鼠标设置工具&#xff0c;不论你的Mac OS鼠标是Magic Mouse这样的额蓝牙鼠标还是我们常用的USB鼠标你都可以轻松设置。steermouse mac版软件介绍SteerMouse是一个实用程序&#xff0c;可让您自由地自定义按钮&#xff0c;滚轮和光标速度。无论鼠标是…

JAVA不同类型数组重载_方法的重载;数组 (Java Day05)

一&#xff0c;方法的重载概念&#xff1a;在一个类中&#xff0c;拥有多个方法名相同&#xff0c;参数列表不同的方法的现象叫做方法的重载特征&#xff1a;​ 1、在同一个类中​ 2、方法名相同​ 3、参数列表不同参数列表的不同&#xff1a…

佳博网络打印机改ip工具_换IP软件为什么是网络工作者首选工具?

科技的不断发展也在促使着网络技术的进步&#xff0c;而网络对于我们日常工作生活来说是不可或缺的&#xff0c;太多事情都需要在网络中完成&#xff0c;对于互联网从业者深知其重要性&#xff0c;常常会因为项目的不同需要切换不同的IP地址来进行工作&#xff0c;一般情况下我…

玩ts要注意什么_番禺三维创意拍摄要注意什么

番禺三维创意拍摄要注意什么 广州思卓传媒有限公司(简称思卓传媒)成立于互联网&#xff0c;视频迅速崛起的21世纪&#xff0c;前身为思卓影视工作室&#xff0c;近十年积累了丰富品牌策划制作&#xff0c;以专注&#xff0c;精益求精的匠人精神为追求&#xff0c;致力于产生专业…

java c 客户端_java基于C/S模式实现聊天程序(客户端)

经过这几天对java的学习&#xff0c;用java做了这个计算机网络的课程设计&#xff0c;基于C/S模式的简单聊天程序&#xff0c;此篇文章介绍一些客户端的一些东西。先讲一讲此聊天程序的基本原理&#xff0c;客户端发送消息至服务器&#xff0c;服务器收到消息之后将其转发给连接…

4接口引脚定义_浅谈USB Type-C接口

笔者前段时间做了一款STM32下载器&#xff0c;为了与新时代接轨&#xff0c;在设计电路板的时候首次使用了USBType-C接口&#xff0c;后来发现其确实很好用。就在今天又设计制作了一款USB-hub&#xff0c;在硬件上我又使用了Type-C接口&#xff0c;所以来了兴致&#xff0c;写一…