16

我需要确定我的输入属于哪种自然语言。目标是区分混合输入中的阿拉伯语英语单词,其中输入是 Unicode 并从 XML 文本节点中提取。我注意到了课堂Character.UnicodeBlock。和我的问题有关吗?我怎样才能让它工作?

编辑:Character.UnicodeBlock方法对阿拉伯语很有用,但显然不适用于英语(或其他欧洲语言),因为BASIC_LATINUnicode 块涵盖符号和不可打印字符以及字母。所以现在我使用带有正则表达式matches()的对象的方法。我可以忍受它,但也许有人可以提出更好/更快的方法。String"[A-Za-z]+"

4

5 回答 5

19

是的,您可以简单地使用Character.UnicodeBlock.of(char)

于 2009-01-01T08:49:02.147 回答
4

如果[A-Za-z]+满足您的要求,您将找不到更快或更漂亮的东西。但是,如果你想匹配 Latin1 块中的所有字母(包括重音字母和连字),你可以使用这个:

Pattern p = Pattern.compile("[\\pL&&\\p{L1}]+");

这是所有 Unicode 字母的集合和所有 Latin1 字符的集合的交集。

于 2009-01-04T11:31:37.410 回答
2

Unicode Script 属性可能更有用。在 Java 中,可以使用java.lang.Character.UnicodeScript类来查找它:

Character.UnicodeScript script = Character.UnicodeScript.of(c);
于 2015-10-07T13:19:17.667 回答
1

英文字符往往在这 4 个 Unicode 块中:

ArrayList<Character.UnicodeBlock> english = new ArrayList<>();
english.add(Character.UnicodeBlock.BASIC_LATIN);
english.add(Character.UnicodeBlock.LATIN_1_SUPPLEMENT);
english.add(Character.UnicodeBlock.LATIN_EXTENDED_A);
english.add(Character.UnicodeBlock.GENERAL_PUNCTUATION);

因此,如果您有一个字符串,您可以遍历所有字符并查看每个字符所在的 Unicode 块:

for (char currentChar : myString.toCharArray())  
{
    Character.UnicodeBlock unicodeBlock = Character.UnicodeBlock.of(currentChar);
    if (english.contains(unicodeBlock))
    {
        // This character is English
    }
}

如果它们都是英文的,那么你知道你有全是英文的字符。您可以对任何语言重复此操作;您只需要弄清楚每种语言使用的 Unicode 块。

注意:这并不意味着您已经证明该语言英语。您只证明了它使用的是英文字符。它可能是法语、德语、西班牙语或其他字符与英语有很多重叠的语言。

还有其他方法可以检测实际的自然语言。像 langdetect 这样的库,我已经非常成功地使用了,可以为你做到这一点:

https://code.google.com/p/language-detection/

于 2015-10-03T13:31:10.513 回答
0

你有与这个相反的问题但具有讽刺意味的是,什么对他不起作用,它应该对你有用。它只是用 reg-exp "\w" 查找英文单词(仅与 ASCII 兼容的字符)。

于 2009-01-03T13:08:46.747 回答