1

この大きなテキストがあります(LARGEを読んでください)。すべての単語をトークン化し、すべての非文字を区切る必要があります。StringTokenizer を使用して、一度に 1 つの単語を読み取りました。ただし、次のようなことをする代わりに、区切り文字列 (「すべての非文字」) を記述する方法を調査していたので、

new StringTokenizer(text, "\" ();,.'[]{}!?:”“…\n\r0123456789 [etc etc]");

誰もが基本的に StringTokenizer を嫌うことがわかりました (なぜ?)。

では、代わりに何を使用できますか?私の大きなテキストを複製するので、 String.split を提案しないでください。テキストを単語ごとに調べ、文字以外のすべてを区切る必要があります。自分で何かを構築する方が簡単ですか、それともこの問題に立ち向かうためのベストプラクティスの方法はありますか?

前もって感謝します!

4

5 に答える 5

3

StringTokenizer、ドキュメント"StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead."による

メモリが本当に問題になる場合は、文字列を文字ごとに繰り返し、区切り文字の間の部分文字列を処理してから次に進むことができます。

于 2012-04-07T08:19:33.353 に答える
2

Google のライブラリの柔軟な文字列Splitterクラスを使用できます。

より強力なものが必要な場合は、Apache LuceneのStandardTokenizerをご覧ください。ドキュメントから:

これは、ほとんどのヨーロッパ言語のドキュメントに適したトークナイザーです。

  • 句読点で単語を分割し、句読点を削除します。ただし、空白が続かないドットは、トークンの一部と見なされます。
  • トークンに数字が含まれていない限り、単語をハイフンで分割します。数字が含まれている場合、トークン全体が製品番号として解釈され、分割されません。
  • 電子メール アドレスとインターネット ホスト名を 1 つのトークンとして認識します。
于 2012-04-07T09:28:49.920 に答える
1

文法が複雑でファイルが大きい場合は、JavaCCの使用を検討できます。

私があなたの状況にいるとき、私はそれを使います。

于 2012-04-07T08:36:09.683 に答える
0

Scanner.class は単語単位 (または行単位) で読み取り、大きなファイル (または入力ストリーム) で使用できます。

正規表現のパターンは、スペースや多くのものを検出できます (\p{..} のようなものを見つけることができる § を見てください)

于 2012-04-07T15:52:05.080 に答える
-1

私は決して正規表現のファンではありませんでしたが、StringTokenizer を使用するだけでは何も問題はありません"[^a-zA-Z]"

于 2012-04-07T08:27:33.530 に答える