语言检测的问题在于,它永远不会完全精确。我的浏览器经常错误地识别语言,它是由谷歌完成的,他可能在这些任务上投入了很多伟大的思想。
不过这里有几点需要考虑:
我不确定 PerlsLingua::Identify
模块真正使用的是什么,但大多数情况下,这些任务是由 Naive Baysian 模型处理的,正如有人在另一个答案中指出的那样。贝叶斯模型使用概率分类为多个类别,在您的情况下,这些将是不同的语言。现在,这些概率既是相关概率,即某个特征在每个类别中出现的频率,也是独立(先验)概率,即每个类别总共出现的频率。
因为这两种信息都被使用了,所以当先验错误时,您很可能会得到较低的预测质量。我猜Linua::Identify
大部分是由在线文档语料库训练的,所以最高的先验很可能是英语。这意味着什么,这Lingua::Identify
很可能会将您的文档归类为英语,除非它有严重的理由不相信(在您的情况下,它很可能确实有严重的原因,因为您说您的文档被错误分类为意大利语、法语和西班牙语)。
这意味着如果可能,您应该尝试重新训练您的模型。里面可能有一些方法Lingua::Identify
可以帮助你解决这个问题。如果没有,我建议您编写自己的朴素贝叶斯分类器(实际上很简单)。
如果你有一个朴素贝叶斯分类器,你必须决定一组特征。大多数情况下,每种语言的字母频率都非常具有特征,因此这是第一个猜测。只需先尝试在这些频率上训练您的分类器。朴素贝叶斯分类器用于垃圾邮件过滤器,因此您可以像其中之一一样训练它。让它在样本集上运行,每当你得到错误分类时,将分类器更新为正确的分类。一段时间后,它会越来越少出错。
如果单个字母频率不能给您足够好的结果,您可以尝试使用 n-gram 代替(但是请注意这将引入的组合爆炸)。我不建议尝试超过 3 克的重量。如果这仍然没有给您带来好的结果,请尝试手动识别每种语言中唯一的常用词并将其添加到您的功能集中。我敢肯定,一旦您开始对此进行试验,您将获得更多尝试功能的想法。
使用贝叶斯分类器的方法的另一个好处是,您可以随时添加新信息,以防出现更多与训练数据不匹配的文档。在这种情况下,您只需重新分类一些新文档,类似于垃圾邮件过滤器,分类器将适应不断变化的环境。