赞
踩
五个Python工具,用于识别文本的语种以及速度和准确性测试。 大多数NLP应用程序往往是特定于语种的,因此需要单语数据。为了用特定语种构建应用程序,可能需要应用预处理技术,过滤掉用非特定语种编写的文本。这需要正确标识每个输入示例的语种。下面我列出了一些可以作为Python模块用于此预处理需求的工具,并提供了一个性能基准来评估每个工具的速度和准确性。
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满足您的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}
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尤其夸耀它的速度(其实也就那样,也有基于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指出,它的预先训练的语种识别模型只需不到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 |
欢迎点赞、分享、收藏~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。