欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

NLP语种检测的基准测试

程序员文章站 2022-03-06 13:58:24
文章目录前言一、langdetect介绍例子要点二、spaCy language detector介绍例子三、gcld3介绍例子四、langid介绍例子五、FastText介绍例子下载实测前言五个Python工具,用于识别文本的语种以及速度和准确性测试。 大多数NLP应用程序往往是特定于语种的,因此需要单语数据。为了用特定语种构建应用程序,可能需要应用预处理技术,过滤掉用非特定语种编写的文本。这需要正确标识每个输入示例的语种。下面我列出了一些可以作为Python模块用于此预处理需求的工具,并提供了一...


前言

五个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条测试用例)
langdetect 3.835321426391601 0.6746746746746747
langid 0.475775241851806 0.6996996996996997
gcid 0.08254218101501465 0.6376376376376376
fasttext 0.011835336685180 0.7557557557557557

欢迎点赞、分享、收藏~

本文地址:https://blog.csdn.net/weixin_45114252/article/details/111053988