我有一套两种语言的文件:英语和德语.没有关于这些文档的可用元信息,程序只能查看内容.基于此,程序必须决定编写文档的两种语言中的哪一种.
是否有任何"标准"算法可以在几个小时内实现此问题?或者,可以执行此操作的免费.NET库或工具包?我知道LingPipe,但确实如此
Java的
不适用于"半商业"用途
这个问题似乎非常困难.我检查了谷歌AJAX语言API(我通过首先搜索这个网站找到),但它是非常糟糕的.对于我指出的六个德语网页,只有一个猜测是正确的.其他猜测是瑞典语,英语,丹麦语和法语......
我想出的一个简单方法是使用一个停用词列表.我的应用程序已经使用德国文档的这样一个列表,以便用Lucene.Net进行分析.如果我的应用程序扫描文档中是否出现任何一种语言的停用词,那么具有更多出现次数的那些将获胜.一个非常天真的方法,可以肯定,但它可能已经足够好了.不幸的是,我没有时间成为自然语言处理方面的专家,尽管这是一个有趣的话题.
尝试测量文本中每个字母的出现次数.对于英语和德语文本,计算频率,也可以计算它们的分布.获得这些数据后,您可以推断出文本频率分布所属的语言.
您应该使用贝叶斯推理来确定最接近的语言(具有一定的错误概率),或者,可能还有其他统计方法来执行此类任务.
使用停用词列表的问题是鲁棒性.停止单词列表基本上是一组规则,每个单词一个规则.与统计方法相比,基于规则的方法对于看不见的数据往往不那么健壮.您将遇到的一些问题是每种语言包含相同数量的停用词的文档,没有停用词的文档,使用错误语言停止文字的文档等.基于规则的方法无法执行任何规则t指定.
一种不需要你自己实现朴素贝叶斯或任何其他复杂的数学或机器学习算法的方法是计算字符双字母和三元组(取决于你是否有很多或一些数据开始 - bigrams将使用较少的培训数据工作).对已知源语言的少数文档(越多越好)运行计数,然后按计数数量为每种语言构造有序列表.例如,英语将"th"作为最常见的二元组.使用您的有序列表,计算您希望分类的文档中的双字母并按顺序排列.然后浏览每一个并将其在已排序的未知文档列表中的位置与其在每个训练列表中的排名进行比较.给每个二元组一个每种语言的分数
1 / ABS(RankInUnknown - RankInLanguage + 1)
.
无论哪种语言得分最高,都是赢家.它很简单,不需要大量编码,也不需要大量的训练数据.更好的是,您可以继续向其中添加数据,并且它会得到改善.此外,您不必手动创建一个停用词列表,它不会因为文档中没有停用词而失败.
它仍然会被包含相等对称二元组计数的文档所混淆.如果你能获得足够的训练数据,那么使用三卦会降低这种可能性.但是使用trigrams意味着您还需要更长的未知文档.真正短的文档可能要求您下拉到单个字符(unigram)计数.
所有这些说,你会有错误.没有银弹.结合方法并选择最能使您对每种方法充满信心的语言可能是最明智的做法.