2

我需要实现一个非常粗略的语言识别算法。在我的世界里,只有两种语言:英语和非英语。我有 ArrayList,我需要确定每个字符串是否可能是英语或其他语言,其 Unicode 字符在一定范围内。所以我想做的是使用某种类型的“存在”测试来检查每个字符串是否在这个范围内。如果它通过了测试,我说这个字符串不是英文的,否则就是英文的。我想尝试两种类型的测试:

  1. TEST-ANY:如果字符串中的任何字符在范围内,则字符串通过测试
  2. TEST-ALL:如果字符串中的所有字符都在范围内,则字符串通过测试

由于数组可能很长,我需要非常有效地实现它。在 Java 中执行此操作的最快方法是什么?

谢谢

更新:我专门通过查看特定范围的 Unicode 来检查非英语,而不是检查字符是否为 ASCII,部分是为了解决下面提到的“恢复”问题。我想弄清楚的是Java是否提供了任何基本上尽可能有效地实现TEST-ANY或TEST-ALL(或其他类似测试)的类/方法。换句话说,我试图避免重新发明轮子,尤其是如果在我之前发明的轮子更好的话。

4

3 回答 3

4

我真的不认为这个解决方案是确定语言的理想选择,但是如果你想检查一个字符串是否都是 ascii,你可以这样做:

public static boolean isASCII(String s){
    boolean ret = true;
    for(int i = 0; i < s.length() ; i++) {
        if(s.charAt(i)>=128){
            ret = false;
            break;
        }
    }
    return ret;
}

那么,如果你试试这个:

boolean r = isASCII("Hello");

r等于真。但如果你尝试:

boolean r = isASCII("Grüß dich");

那么r等于假。我还没有测试过性能,但这会相当快,因为​​它所做的只是将一个字符与数字 128 进行比较。

但是正如@AlexanderPogrebnyak 在上面的评论中提到的那样,如果你给它“简历”,这将返回 false。请注意这一点。

更新:

我专门通过查看特定范围的 Unicode 来检查非英语,而不是检查字符是否为 ASCII

但是 ASCIIUnicode 中的一个范围(至少在 UTF-8 中)。Unicode 只是 ASCII 的扩展。什么代码@mP。我提供的是检查每个字符是否在一定范围内。我选择该范围为 ASCII,即十进制值小于 128 的任何 Unicode 字符。您也可以选择任何其他范围。但我选择 ASCII 的原因是它包含拉丁字母、阿拉伯数字和其他一些通常出现在“英语”字符串中的常见字符。

于 2012-06-05T01:43:15.427 回答
4

以下是我最终实施 TEST-ANY 的方式:

// TEST-ANY
String str = "wordToTest";
int UrangeLow = 1234; // can get range from e.g. http://www.utf8-chartable.de/unicode-utf8-table.pl
int UrangeHigh = 2345;
for(int iLetter = 0; iLetter < str.length() ; iLetter++) {
   int cp = str.codePointAt(iLetter);
   if (cp >= UrangeLow && cp <= UrangeHigh) {
      // word is NOT English
      return;
   } 
}
// word is English
return;
于 2012-06-05T17:31:50.913 回答
2
public static boolean isAscii( String s ){
    int length = s.length;
    for( int i = 0; i < length; i++){
       final char c = s.charAt( i );
       if( c > 'z' ){
          return false;
       }
    }
    return true;
}

@Hassan 感谢您选择用小 z 对 big Z 进行的错字替换测试。

于 2012-06-05T02:06:46.110 回答