如何检测utf8中使用的字母?

时间:2013-01-02 19:03:11

标签: c unicode utf-8

我想快速而又肮脏地确定用户正在撰写的语言。我知道有一个Google API可以检测法语和西班牙语之间的差异(即使它们都使用大致相同的字母表),但是我不想要延迟。从本质上讲,我知道拉丁字母对于它使用的语言有很多困惑。但是,其他字母表却没有。例如,如果有一个角色使用平假名(日语写作系统的一部分),则不会混淆语言。因此,我不需要问谷歌。

因此,我希望能够做一些简单的事情,例如שלום使用希伯来语字母,こんにちは使用日语字符。我如何获得该字母串?

“Bonjour”,“你好”等应该返回“拉丁语”或“英语”(然后我会问谷歌的真实语言)。 “こんにちは”应该返回“平假名”或“日语”。 “שלום”应该返回“希伯来语”。

2 个答案:

答案 0 :(得分:2)

我建议查看Unicode "Script" property。可以找到最新的数据库here

对于快速而又脏的实现,我会尝试扫描目标文本中的所有字符,并查找每个字符的脚本名称。选择具有最多字符的脚本。

答案 1 :(得分:1)

使用N-gram模型,然后提供足够大的训练数据集。在此页面上可以找到描述此技术的完整示例:

http://phpir.com/language-detection-with-n-grams/

虽然本文假设您正在使用PHP和#34;语言"你的意思是英语,意大利语等...如果你需要这个,可以在C中实现描述,而不是使用"语言"如英语等等,用于培训,只需使用"字母表"为了训练。例如,查看所有"拉丁字母"串起来并考虑n = 2的n-gram:

Bonjour:" Bo"," on"," nj"," jo"," ou", "乌尔"

你好:"他"," el"," ll"," lo"

通过足够的训练数据,您将发现可能适用于所有拉丁文本的主要组合,例如,可能" Bo"和" el"很可能用#34;拉丁字母"写的文字。同样地,这些组合在用平假名字母"中写的文本中可能非常罕见。类似的发现将与任何其他字母表分类一起进行,您可以为其提供足够的训练数据。

这种技术也称为隐马尔可夫模型或马尔可夫链;搜索这些关键字将为实施提供更多的想法。对于"快速和肮脏"我会使用n = 2并收集足够的训练数据,以便至少一次遇到每个字母表中最不常见的字母...例如至少有一个''并且至少有一个'ぅ' *小平假名你。

编辑:

对于比N-Grams更简单的解决方案,只使用基本统计测试 - 最小值,最大值和平均值 - 来比较您的输入(用户给出的字符串)和字母表(字母表中的所有字符的字符串)你感兴趣的字母表)。

步骤1.将Alphabet的所有数值(例如utf8代码)放在一个数组中。例如,如果要测试的Alphabet是" Basic Latin",请创建一个数组DEF:= {32,33,34,...,122}。

步骤2.将Input的所有数值放入数组中,例如,创建一个数组INP:= {73,102,32,...}。

步骤3.根据INP和DEF计算输入的分数。如果INP真的来自与DEF相同的字母表,那么我希望以下陈述是正确的:

  • min(INP)> = min(DEF)
  • max(INP)< = max(DEF)
  • avg(INP) - 平均(DEF)< EPS,其中EPS是合适的常数

如果所有陈述均为真,则分数应接近1.0。如果全部都是假的,则分数应接近0.0。在此之后"分数"定义了例程,剩下的就是在你感兴趣的每个字母表中重复它,并选择给定输入得分最高的那个。

相关问题