NLP语种检测的基准对比测试


前言

五个Python工具,用于识别文本的语种以及速度和准确性测试。 大多数NLP应用程序往往是特定于语种的,因此需要单语数据。为了用特定语种构建应用程序,可能需要应用预处理技术,过滤掉用非特定语种编写的文本。这需要正确标识每个输入示例的语种。下面我列出了一些可以作为Python模块用于此预处理需求的工具,并提供了一个性能基准来评估每个工具的速度和准确性。

一、langdetect

介绍

langdetect是Google语言检测库从Java到Python的重新实现
只需将文本传递到导入的detect函数,它将输出两个字母的ISO
693代码,该代码的模型给出了最高的置信度。(有关693种编码及其语言的完整列表,请参阅这里)如果改用detect_langs,它将输出一个模型预测概率最高的语种列表,以及它们的概率。

例子

from langdetect import DetectorFactory, detect, detect_langs
text = "My lubimy mleko i chleb."detect(text) #  'cs'
detect_langs(text)  # [cs:0.7142840957132709, pl:0.14285810606233737, sk:0.14285779665739756]

要点

  • 建议将DetectorFactory种子设置为某个数字。这是因为langdetect的算法是非确定性的,这意味着如果您试图在太短或太模糊的文本上运行它,那么每次运行它时可能会得到不同的结果。设置种子可以强制在开发/评估的时候得到一致的结果。
  • 在try/except块中用LanguageDetectException包围detect调用,否则很可能会出现“No features in text”错误,当给定输入的语言无法计算为包含URL、数字、公式等字符串时,会发生此错误。(这模块那么慢的原因)

二、spaCy language detector

介绍

如果您使用spaCy满足您的NLP需求,那么您可以向现有的spaCy管道添加一个自定义语言检测组件,这将使您能够在Doc对象上设置一个名为.language的扩展属性。然后可以通过Doc._.language访问该属性,它将返回预测的语种及其概率。

例子

import spacy
from spacy_langdetect import LanguageDetector
text2 = 'In 1793, Alexander Hamilton recruited Webster to move to New York City and become an editor for a Federalist Party newspaper.'
nlp = spacy.load('en_core_web_sm')
nlp.add_pipe(LanguageDetector(), name='language_detector', last=True)
doc = nlp(text)
doc._.language  # {'language': 'en', 'score': 0.9999978351575265}

三、gcld3

介绍

CLD3是一种用于语言识别的神经网络模型。这个包包含推理代码和一个经过训练的模型。推理代码从输入文本中提取字符n-gram并计算每个字符出现的次数。

例子

import gcld3
detector = gcld3.NNetLanguageIdentifier(min_num_bytes=0,
                                        max_num_bytes=1000)

text = "This text is written in English"
result = detector.FindLanguage(text=text)
print(result.language)

四、langid

介绍

langid尤其夸耀它的速度(其实也就那样,也有基于c编写的模块,就是编译有点费劲)。它的工作原理与上面的工具类似,但是通过运行python
langid.py,它还可以作为命令行工具使用。查看他们的仓库以了解更多细节和其他选项。

例子

import langid
langid.classify(text2)  # ('en', -127.75649309158325)

# 或者将概率转(0,1)范围
from langid.langid import LanguageIdentifier, model
lang_identifier = LanguageIdentifier.from_modelstring(model, norm_probs=True)
lang_identifier.classify(text2) # ('en', 0.999999999999998)

五、FastText

介绍

fasttext指出,它的预先训练的语种识别模型只需不到1MB的内存,而每秒能够对数千个文档进行语种识别。

例子

import fasttext

path_to_pretrained_model = '/tmp/lid.176.bin'
fmodel = fasttext.load_model(path_to_pretrained_model)
fmodel.predict([text2])  # ([['__label__en']], [array([0.9331119], dtype=float32)]

下载

lid.176.bin:更快,更精确(文件大小=126MB)
lid.176.ftz:模型的压缩版本(文件大小=917kB)

实测

是骡子是马,拿出来溜溜。
我服务器配置挺高,数据在不同机器存在差异。
但对比明显,fasttext好了一个level。

语言模块处理总时长(1000条测试用例)准确率(1000条测试用例)
langdetect3.8353214263916010.6746746746746747
langid0.4757752418518060.6996996996996997
gcid0.082542181015014650.6376376376376376
fasttext0.0118353366851800.7557557557557557

欢迎点赞、分享、收藏~

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值