在我的应用程序中,我有 unicode 字符串,我需要知道字符串使用哪种语言,我想通过确定字符串的字符在哪个范围内来缩小可能语言的列表来做到这一点。
我从http://jrgraphix.net/research/unicode_blocks.php获得的范围
以及来自http://unicode-table.com/en/的可能语言
问题是算法必须检测所有语言,有人知道 unicode 范围到语言的更广泛映射吗?
谢谢沃伊切赫
在我的应用程序中,我有 unicode 字符串,我需要知道字符串使用哪种语言,我想通过确定字符串的字符在哪个范围内来缩小可能语言的列表来做到这一点。
我从http://jrgraphix.net/research/unicode_blocks.php获得的范围
以及来自http://unicode-table.com/en/的可能语言
问题是算法必须检测所有语言,有人知道 unicode 范围到语言的更广泛映射吗?
谢谢沃伊切赫
这实际上是不可能的,原因有两个:
许多语言共享相同的书写系统。例如,看看英语和荷兰语。两者都使用基本拉丁字母。仅查看代码点的范围,您根本无法区分它们。
某些语言使用更多字符,但不能保证特定文本包含它们。例如,德语使用基本拉丁字母加上“ä”、“ö”、“ü”和“ß”。虽然这些字母并不是特别少见,但您可以轻松地创建没有它们的整个句子。因此,短文本可能不包含它们。因此,再一次,仅查看代码点是不够的。
文本并不总是“纯”的。由于法语借词(例如“déjà vu”),英文文本可能包含法语字母。或者它可能包含外来词,因为文本在谈论外来事物(例如“Götterdämmerung 是理查德·瓦格纳的歌剧……”,或“万里长城是……”)。仅查看代码点会产生误导。
总而言之,不,您不能可靠地将代码点范围映射到语言。
你可以做什么:计算每个字符在文本中出现的频率,并与已知语言的统计数据进行启发式比较。或者分析单词结构,例如使用马尔可夫链。或在字典中搜索单词(考虑屈折变化、构图等)。或这些的组合。
但这很困难,而且工作量很大。您应该使用现有的解决方案,例如 deceze 和 Esailija 推荐的解决方案。
我喜欢使用谷歌翻译之类的建议——因为他们会为你做所有的工作。
您也许可以构建一个基于规则的系统,让您成为其中的一部分。为语言建立启发式规则,看看这是否足够。某些藏文字符确实表示藏文,并且在许多语言中都有独特的字符将被赠送。但正如另一个答案所指出的那样,有限的文本样本可能并不那么准确,因为您可能没有明确的指标。
然而,语言在每个字符出现的频率上会有所不同,因此您可以拥有每种语言的基本指纹,您需要根据字母频率进行分类和猜测。这可能比基于规则的系统更进一步。构建它的一个好工具可能是文本分类算法,它将为您完成所有分析。您将使用不同的语言训练算法,而不必自己阐明实际规则。
一个更复杂的版本大概是谷歌所做的。