2

非常に大雑把な言語識別アルゴリズムを実装する必要があります。私の世界では、英語と英語以外の2つの言語しかありません。ArrayListがあり、各文字列が英語であるか、Unicode文字が特定の範囲にある他の言語である可能性が高いかを判断する必要があります。したがって、私がやりたいのは、ある種の「プレゼンス」テストを使用して、この範囲に対して各文字列をチェックすることです。テストに合格した場合、文字列は英語ではないと言います。それ以外の場合は英語です。2種類のテストを試したい:

  1. TEST-ANY:文字列内のいずれかの文字が範囲内にある場合、文字列はテストに合格します
  2. TEST-ALL:文字列内のすべての文字が範囲内にある場合、文字列はテストに合格します

配列が非常に長い可能性があるため、これを非常に効率的に実装する必要があります。Javaでこれを行う最速の方法は何でしょうか?

どうも

更新:私は、文字がASCIIであるかどうかをチェックするのではなく、特定の範囲のUnicodeを調べることによって、英語以外を具体的にチェックしています。これは、以下で説明する「再開」の問題に対処するためです。私が理解しようとしているのは、Javaが本質的にTEST-ANYまたはTEST-ALL(または別の同様のテスト)を可能な限り効率的に実装するクラス/メソッドを提供するかどうかです。言い換えれば、私は、特に私の前に発明されたホイールがとにかく優れている場合は、ホイールの再発明を避けようとしています。

4

3 に答える 3

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 に答える
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");

rtrue になります。しかし、試してみると:

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

そのr場合は false になります。私はパフォーマンスをテストしていませんが、文字を 128 と比較するだけなので、かなり高速に動作します。

ただし、上記のコメントで @AlexanderPogrebnyak が述べたように、「履歴書」を指定すると false が返されます。そのことに注意してください。

アップデート:

文字がASCIIかどうかをチェックするのではなく、特定の範囲のUnicodeを調べることで、英語以外を具体的にチェックしています

しかし、ASCIIUnicode の範囲です (少なくとも UTF-8 では)。Unicode は ASCII の単なる拡張です。何というコード @mP. 私が提供したのは、各文字が特定の範囲内にあるかどうかを確認することです。その範囲として ASCII を選択しました。ASCII は、10 進値が 128 未満の任意の Unicode 文字です。他の範囲を選択することもできます。しかし、私が ASCII を選んだ理由は、ラテン アルファベット、アラビア数字、および通常は「英語」の文字列に含まれるその他の一般的な文字を含むものだからです。

于 2012-06-05T01:43:15.427 に答える
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に対するテストを小さなzで置き換えたタイプミスを選んでくれてありがとう。

于 2012-06-05T02:06:46.110 に答える