如何确定文档的(自然)语言?
.net
nlp
text-mining
6
0

我有一套使用两种语言的文档:英语和德语。关于这些文档没有可用的元信息,程序只能查看其内容。基于此,程序必须决定用哪种语言编写文档。

是否有可以在几个小时内实现的针对该问题的“标准”算法?或者,一个免费的.NET库或工具包可以做到这一点?我知道LingPipe ,但是

  1. 爪哇
  2. 对于“半商业”用途不是免费的

这个问题似乎很难解决。我签出了Google AJAX语言API (我是通过首先搜索该网站发现的),但是这很糟糕。对于我指向的六个德语德语网页,只有一个猜测是正确的。其他猜测是瑞典文,英文,丹麦文和法文...

我想到的一种简单方法是使用停用词列表。我的应用程序已经使用了这样的德国文档列表,以便通过Lucene.Net对其进行分析。如果我的应用程序从任何一种语言扫描文档中是否出现停用词,则赢得次数最多的停用词会获胜。可以肯定,这是一种非常幼稚的方法,但这可能已经足够了。不幸的是,尽管这是一个有趣的话题,但我没有时间成为自然语言处理方面的专家。

参考资料:
Stack Overflow
收藏
评论
共 7 个回答
高赞 时间 活跃

使用停用词列表的问题是鲁棒性之一。停用词列表基本上是一组规则,每个单词一个规则。与统计方法相比,基于规则的方法对于看不见的数据往往不那么健壮。您将遇到的一些问题是包含每种语言的停用词数量相等的文档,没有停用词的文档,包含来自错误语言的停用词的文档等。基于规则的方法无法执行其规则可以做的任何事情t指定。

一种不需要您自己实现朴素贝叶斯或任何其他复杂的数学或机器学习算法的方法,就是对字符双字母组和三字母组进行计数(取决于您是从大量数据中还是从少量数据开始,双字母组将使用较少的培训数据)。对少数几种已知源语言的文档(越多越好)运行计数,然后根据计数数量为每种语言构造一个有序列表。例如,英语将“ th”作为最常见的二元组。手持有序列表,计算要分类的文档中的二元组,并将其排序。然后遍历每个文档,并将其在排序的未知文档列表中的位置与其在每个培训列表中的排名进行比较。给每个二元组每种语言的分数

1 / ABS(RankInUnknown - RankInLanguage + 1)

最终得分最高的语言是获胜者。它很简单,不需要很多编码,也不需要很多训练数据。更好的是,您可以继续添加数据,它会不断改进。另外,您不必手动创建停用词列表,并且不会因为文档中没有停用词而失败。

它仍然会被包含相等对称二元数的文档所混淆。如果您可以获得足够的训练数据,则使用三字母组合会减少这种可能性。但是使用三字母组合词意味着您还需要未知文档更长。真正简短的文档可能需要您减少到单个字符(字母组合)的计数。

所有这些,您将遇到错误。没有银弹。组合方法并选择使您对每种方法有最大信心的语言可能是最明智的选择。

收藏
评论

从概念上讲,语言检测不是很困难。请查看我对相关问题的答复以及对同一问题的其他答复。

万一您想自己写一个镜头,您应该能够在半天之内编写一个幼稚的探测器。我们在工作中使用类似于以下算法的方法,并且效果惊人。另请阅读我链接的文章中的python实现教程。

步骤

  1. 对两种语言采用两个语料库,并提取字符级双字母组,三字母组和空格分隔的标记(单词)。跟踪其频率。此步骤将为两种语言构建您的“语言模型”。

  2. 给定一段文本,请为每个语料库确定字符二元组,三元组和空格分隔的标记及其对应的“相对频率”。如果模型中缺少特定的“特征”(字符二元组/三元组或标记),则将其“原始计数”视为1并使用其计算“相对频率”。

  3. 特定语言的相对频率的乘积给出了该语言的“分数”。这是该句子属于该语言的概率的非常幼稚的近似值

  4. 得分较高的语言获胜。

注意1:对于未在我们的语言模型中出现的功能,我们将“原始计数”视为1。这是因为,实际上,该功能的价值很小,但是由于我们的语料有限,因此我们可能还没有遇到过。如果您认为计数为零,那么整个产品也将为零。为了避免这种情况,我们假设它在我们的语料库中为1。这称为附加平滑。还有其他先进的平滑技术

注意2:由于您将要乘以大量的分数,因此可以轻松地将其设为零。为避免这种情况,您可以在对数空间中工作,并使用此方程式计算分数。

                a X b =  exp(log(a)+log(b))

注3:我描述的算法是“ 朴素贝叶斯算法 ”的“非常幼稚”版本。

收藏
评论

两种语言的停用词处理方法很快,例如,通过对其他德语中的“ das”和英语中的“ the”中没有出现的停用词进行加权,可以使其变得更快。 “专有词”的使用也将有助于将该方法有效地扩展到更大范围的语言上。

收藏
评论

英文和德文使用相同的字母集,但ä,ö,ü和ß(eszett)除外。您可以寻找那些字母来确定语言。

您还可以查看Grefenstette的这段文字( 比较两种语言识别方案 )。它查看字母三字组和简短的单词。德语en_,er _,_ de的常见字母组合。英语the_,he_,the ...的常见三字组

还有Bob Carpenter的LingPipe如何执行语言ID?

收藏
评论

尝试测量文本中每个字母的出现情况。对于英语和德语文本,将计算频率以及它们的分布。获取这些数据后,您可能会推断出文本频率分布属于哪种语言。

您应该使用贝叶斯推理来确定最接近的语言(具有一定的错误概率),或者,也许还有其他统计方法可用于此类任务。

收藏
评论

我相信标准程序是使用测试数据(即语料库 )来衡量所提出算法的质量。定义您希望算法实现的正确分析的百分比,然后在您手动分类的许多文档上运行它。

至于特定的算法:使用停用词列表听起来不错。据报道有效的另一种方法是使用贝叶斯过滤器 ,例如SpamBayes 。与其培训火腿和垃圾邮件,不如将其培训成英语和德语。使用您的语料库的一部分,通过spambayes运行它,然后在完整数据上对其进行测试。

收藏
评论

如果您想发挥自己的编程能力,尝试自己解决问题,我鼓励您;但是,如果您要使用轮子,则轮子存在。

Windows 7内置了此功能。在任何Windows 7或Windows Server 2008计算机上,名为“扩展语言服务”(ELS)的组件都可以检测脚本和自然语言。取决于您是否有可用的此类计算机以及您说“免费”时的意思,这将为您做到这一点。无论如何,这是Google或此处提到的其他供应商的替代方案。

http://msdn.microsoft.com/zh-CN/library/dd317700(v=VS.85).aspx

而且,如果您想从.NET访问此文件,则此处有一些信息:

http://windowsteamblog.com/blogs/developers/archive/2009/05/18/windows-7-managed-code-apis.aspx

希望能有所帮助。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号