中英文检测/语言识别分类的实用方法介绍

       前言:我在实习和写课程大作业的过程中都遇到过这样的问题,一个网站要支持多语言,有的时候就需要分语言训练模型,所以第一步就是识别用户输入的语言类型,然后再把inputted_sentence传给对应语言的工作流。但是感觉网上没有特别全面的方法介绍,因此我自己总结了以下两方面的方法分享给大家:(1)通过Unicode范围安装比例自己写一个简单函数(2)直接调用别人写好的工具包(langdetect,langid,fastText等)。

        首先我们先明确一件事,什么样的句子应该判为中文,像“我爱自然语言处理”,“我是一名北大学生”这种全是汉字的当然是中文句子,但是对于“我爱nlp”,“我喜欢吃kfc”这种中英夹杂的句子也应该被判为中文句子,所以我们得出结论:在日常通用场景中,我们把汉字超过一定比例的句子判定为中文句子。英文句子的检测也类似。

1.自己写函数

1.1 全中文

要实现上面的目标,我们先从最简单的写起:当句子全为汉字时才判断为中文句。

def detect_language(text): 
    for char in text:
        # 判断是否是中文字符
        if not '\u4e00' <= char <= '\u9fff':
            return False
    return True
            

1.2 设置中文占比

然后我们开始考虑比例,分别计算句子里中英文字符的数量:当汉字占比超过设定的radio时就判断为中文句。

def detect_language(text,radio):
    chinese_count, english_count = 0, 0
    text_count=len(text)
    
    for char in text:
        # 判断是否是中文字符 (Unicode 范围: \u4e00 - \u9fff)
        if '\u4e00' <= char <= '\u9fff':
            chinese_count += 1
        # 判断是否是英文字符 (大写字母 U+0041 - U+005A,小写字母 U+0061 - U+007A)
        elif ('\u0041' <= char <= '\u005A') or ('\u0061' <= char <= '\u007A'):
            english_count += 1

    # 根据中文和英文字符的比例判断
    if chinese_count/text_count>radio:
        return "Chinese"
    elif english_count/text_count>radio:
        return "English"
    else:
        return "Unknown"

# 测试
sentence1 = "我喜欢吃肯德基"
sentence2 = "I like eating Kentucky Fried Chicken"
sentence3 = "我喜欢吃kfc"

print(f"Sentence 1: {detect_language(sentence1,0.5)}")  # Chinese
print(f"Sentence 2: {detect_language(sentence2,0.5)}")  # English
print(f"Sentence 3: {detect_language(sentence3,0.5)}")  # Chinese

2.调用工具包

除了自己编写函数,定义比例外我们还可以引用现成的工具包。

2.1 Langdetect

pip install langdetect

langdetect是基于Java语言包language-detection实现的python语言包。shuyo/language-detection: This is a language detection library implemented in plain Java. (aliases: language identification, language guessing) (github.com)命令行安装后即可调用函数如下。

但是问题在于langdetect在简短句子上表现不佳,比如“I am a student”就会被认为是罗马尼亚语而输出unknown。

import langdetect
input_sentence = "I am a student who studying in PKU university"
detected_lang = langdetect.detect(input_sentence)

if detected_lang == 'zh-cn':
    print("Chinese")
elif detected_lang == 'en':
    print("English")
else:
    print("Unknown")

#运行结果:English

2.2 Langid

pip install langid

langid是一个轻量级的语言识别工具,源代码地址:saffsd/langid.py: Stand-alone language identification system (github.com)

import langid
text = "我爱自然语言处理"
lang, confidence = langid.classify(text)
print(f"Detected language: {lang}, Confidence: {confidence}")

#运行结果:
#Detected language: zh, Confidence: -82.60744643211365,

lang代表预测的语言,confidence是置信度得分,这里默认的confidence出于方便计算很小的数采用的是对数计算方法,如果要显示常见的0-1的浮点数表达可以用下面的这段代码。置信度越高说明越确定语言的判定结果。

from langid.langid import LanguageIdentifier, model
identifier = LanguageIdentifier.from_modelstring(model, norm_probs=True)
lang,confidence=identifier.classify(text)
print(f"Detected language: {lang}, Confidence: {confidence}")

#运行结果:
#Detected language: zh, Confidence: 0.9999865409755342

2.3 FastText

pip install fasttext

fastText 是由 Facebook AI Research 团队开发的快速文本分类工具,支持数百种语言的识别。其中也提供语言检测的功能。官方fastText ,提供两种版本:

import fasttext

model = fasttext.load_model('lid.176.ftz')  # 加载预训练模型
result = model.predict("I love NLP")
print(result)

总结:以上就是全部的介绍内容,提供了小的方法trick,可以直接复制粘贴使用,大家可以按照自己的project的实际需求和个人偏好选择对应的方法。个人比较喜欢的方法是langid,如有不足,欢迎批评指正。如有帮助,请各位友友们多多关注点赞,收藏评论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值