C++中的词语语言检测

7

在谷歌上搜索后,我不知道是否有任何标准的方式或库可用于检测特定单词属于哪种语言。

假设我有任何单词,我该如何找出它属于哪种语言: 英语,日语,意大利语,德语等等。

是否有适用于C ++的库?对此的任何建议将不胜感激!


9
检测单个单词是非常不可靠的。例如,“die”是英语还是德语? - Oliver Charlesworth
1
概率性地是你能做的最好的。 - Paul Beckingham
8个回答

3
简单的语言识别可以从单词入手。您无需理解文本的语义,也不需要任何运算量昂贵的算法,只需要一个快速的哈希表。问题是,您需要大量数据。幸运的是,您可以在每种语言中找到单词字典。为每种语言定义一个位掩码,这将使您能够将诸如“the”的词标记为多种语言中已识别的词。然后,将每种语言的词典读入哈希表中。如果已经从其他语言存在该单词,则同时标记当前语言。

假设给定的单词是英语和法语的。那么当您查找ex(“commercial”)时,将映射到ENGLISH | FRENCH,假设ENGLISH = 1,FRENCH = 2,...您将找到值3.如果要知道单词是否仅在您的语言中,请进行测试:
int langs = dict["the"];
if (langs | mylang == mylang)
   // no other language



由于可能会有其他语言,因此更通用的方法可能更好。 对于向量中设置的每个位,将相应语言的计数加1。 对n个单词执行此操作。 在典型文本中约为n = 10个单词后,您会发现主要语言有10个,与之相关的语言(例如英语/法语)可能有2个,您可以以高概率确定该文本是英语。 请记住,即使您拥有一种语言的文本,它仍然可以引用另一种语言的文本,因此仅有外来词并不意味着该文档是在该语言中编写的。 选择一个阈值,它会工作得非常好(而且非常快)。

显然,最难的是读取所有字典。 这不是代码问题,而是数据收集问题。 幸运的是,这是你的问题,而不是我的问题。

为了使其快速,您需要预加载哈希映射,否则最初加载它会很耗时。 如果这是一个问题,则必须为哈希映射编写存储和加载方法,以有效地阻止整个过程的负载。


5
顺带提一下,你无法仅从一个样本单词来确定文件的语言。它可能只是大型文件中引用的一个外来单词。你也不必费心阅读整篇文章。但你最好不要读取连续的10个单词,因为很容易遇到外语引用,得出错误结论。随机抽样可能是更有效的方式。 - Dov

3
我发现谷歌的CLD非常有用,它是用C++编写的,来自他们的网站: "CLD(紧凑语言检测器)是嵌入在谷歌Chromium浏览器中的库。该库可以从提供的UTF8文本(纯文本或HTML)中检测语言。它是用C++实现的,并带有非常基本的Python绑定。"

2

好的,

统计训练的语言检测器在单词输入方面表现出奇效,尽管显然有些情况下它们不可能起作用,正如其他人所观察到的。

在Java中,我会推荐您使用Apache Tika。它有一个开源的统计语言检测器。

对于C ++,您可以使用JNI来调用它。现在,是免责声明警告的时候了。由于您特别要求使用C ++,而且我不知道是否有C ++免费替代品,因此现在我将指向我的雇主的产品,这是一个在C ++中本地化的统计语言检测器。

http://www.basistech.com,产品名称为RLI。


2
这无法逐字逐句地进行良好的工作,因为许多单词是共用的。例如,在多种语言中,“the”表示“茶”。
语言处理库往往比这个功能更全面,而且C++是一种“高性能”语言,可能很难找到免费的语言处理库。
然而,你自己解决这个问题可能并不太难。请参阅维基百科文章以获取想法。此外,一个小的支持向量机可能会非常方便地解决问题。只需用相关语言中最常见的单词来训练它,你可能只需要几千字节就可以获得非常有效的“数据库”。

感谢您的回复和提供指导的链接。 - Vivek Kumar
@dearvive:点击我的答案左上角的向上箭头以表示感谢:v)。 - Potatoswatter

1
我不会抱太大希望。自动确定一个文本的语言已经很困难了,如果你只有一个单词而没有上下文,那么你需要拥有全世界所有语言的所有单词的数据库……这个数据库的大小将是不可承受的。

自从几个千兆字节被认为是“禁止的”以来已经有一段时间了。 - Mike Seymour
是的,我认为你是对的......但我认为这是可能的,因为微软 Word 在他们的产品中添加了这些功能。 - Vivek Kumar
@Mike Seymour:不是“不可能”的意思,而是“太少的人会有兴趣付出那种努力去猜测一个单词的起源,所以没有人会制作那种库”。 - DevSolar

1
基本上,您需要一个包含所有主要语言的大型数据库。为了自动检测文本的语言,选择词典包含最多来自文本的单词的语言。这不是您想在笔记本电脑上实现的事情。

0

先在所有语言中检查您文本的前3个单词的拼写(要检查的单词越多,结果就越好)。 拼写错误最少的单词“获胜”。 仅使用3个单词,在几种语言中可能具有相同的拼写,但随着每个额外的单词,这种情况变得不太可能。 这不是一种完美的方法,但我认为在大多数情况下都可以使用。

否则,如果所有语言中的错误数量相等,请使用默认语言。 或者随机选择另外3个单词,直到您获得更清晰的结果。 或者将拼写检查的单词数量扩展到超过3个,直到您获得更清晰的结果。

至于拼写检查库,有很多,我个人更喜欢HunspellNuspell 也很好。 使用哪一个取决于个人意见和/或技术能力。


-4

我假设你正在处理文本而不是语音。

如果你正在使用UNICODE,它为每种语言提供了一个插槽。

因此,你可以确定特定单词的所有字符都属于这个语言插槽。

关于unicode语言插槽的更多帮助,你可以在这里找到。


2
那并不会真正起作用,例如德语、英语和意大利语使用相同的字符集。 - Xeo
1
...而且大多数编程语言共享插槽。 - DevSolar
1
如果你需要区分使用相同字符集的两种语言(例如所有西欧语言),那么这并没有什么帮助。 - TonyK
2
不,UNICODE支持多种字符集,并且对于大多数字符集来说,它是与语言无关的。"A"代表哪种语言? - Paul Beckingham
1
Unicode术语实际上是“脚本”,而不是“语言”。Unicode 6定义了93个脚本;世界上大约有6000种语言。 - MSalters
非常感谢。我希望这样可以,我会尽力而为。感谢指导和建议...非常感谢! - Vivek Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接