我对短字符串的检测有一些疑问。我需要检测聊天中发送的文本语言,我面临两个问题:
- 消息长度
- 可能存在的错误和噪音(表情符号等)
但是对于噪音,我清理了消息,这很好,但是对于消息的长度,这是一个问题。例如,如果用户说hi, fasttext将该语言检测为德语文本,但google translate将其检测为英语文本。最有可能的是一条英文信息。所以我试着训练自己的快速文本模型,但我如何才能调整模型,以在短字符串有更好的结果?我需要用很多语言的字典来训练模型才能有更好的效果?
我使用fasttext因为它是最准确的语言检测器。下面是fasttext问题的一个例子:
# wget https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin
import fasttext
text = "Hi"
pretrained_lang_model = "lid.176.bin"
model = fasttext.load_model(pretrained_lang_model)
predictions = model.predict(text, k=2)
print(predictions)
# (('__label__de', '__label__en'), array([0.51606238, 0.31865335]))
根据我的经验,基于fastText或其他分类器的常用方法很难处理短文本。
你可以试试lingua,这是一个语言检测库,可用于Python、Java、Go和Rust。
优点:
…对于长文本和短文本都产生非常准确的结果,即使在单个单词和短语
她使用基于规则和统计的方法,但不使用任何单词字典。
她不需要与任何外部API或服务的连接
正如你在这里读到的,在Lingua中,你似乎也可以限制要考虑的语言集
我找到了一个更好的结果。如果将所有语言在不同检测器(如fastText和lingua)上的所有概率相加,并为短文本添加字典检测。您可以获得非常好的结果(对于我的任务,我还制作了一个基于数据训练的fastText模型)。我已经做了一个演示,但版主不接受,所以我不能发送repo的链接。