文字数の問題は、ビッグデータの世界で最も広く取り上げられている問題の 1 つです。Hadoop のようなフレームワークの Hello World のようなものです。この問題については、ウェブ全体で十分な情報を見つけることができます。
とにかく色々と考えてみます。
まず、900000 ワードはまだハッシュマップを構築するのに十分小さい可能性があるため、明らかなメモリ内アプローチを軽視しないでください。疑似コードは問題ないとあなたは言ったので:
h = new HashMap<String, Integer>();
for each word w picked up while tokenizing the file {
h[w] = w in h ? h[w]++ : 1
}
データセットが大きすぎてメモリ内ハッシュマップを作成できない場合は、次のようにカウントできます。
Tokenize into words writing each word to a single line in a file
Use the Unix sort command to produce the next file
Count as you traverse the sorted file
これらの 3 つのステップは、Unix パイプラインで行われます。ここでは、OS に作業を任せてください。
さらに多くのデータを取得したら、hadoop などの map-reduce フレームワークを導入して、マシンのクラスターで単語カウントを実行する必要があります。
さて、あなたが非常に大きなデータセットに入ると、分散環境で物事を行うことはもはや役に立たないと聞きました.送信時間がカウント時間を圧倒し、単語カウントの場合、すべてを「元に戻す必要がある」からです.とにかく」なので、研究論文に見られると思われる非常に洗練されたテクニックを使用する必要があります.
補遺
OP は、Java で入力をトークン化する例を求めました。最も簡単な方法は次のとおりです。
import java.util.Scanner;
public class WordGenerator {
/**
* Tokenizes standard input into words, writing each word to standard output,
* on per line. Because it reads from standard input and writes to standard
* output, it can easily be used in a pipeline combined with sort, uniq, and
* any other such application.
*/
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (input.hasNext()) {
System.out.println(input.next().toLowerCase());
}
}
}
これを使用する例を次に示します。
echo -e "Hey Moe! Woo\nwoo woo nyuk-nyuk why soitenly. Hey." | java WordGenerator
これは出力します
hey
moe!
woo
woo
woo
nyuk-nyuk
why
soitenly.
hey.
次のように、このトークナイザーを sort および uniq と組み合わせることができます。
echo -e "Hey Moe! Woo\nwoo woo nyuk-nyuk why soitenly. Hey." | java WordGenerator | sort | uniq
降伏
hey
hey.
moe!
nyuk-nyuk
soitenly.
why
woo
文字のみを保持し、句読点、数字、およびその他の文字をすべて破棄する場合は、スキャナー定義行を次のように変更します。
Scanner input = new Scanner(System.in).useDelimiter(Pattern.compile("\\P{L}"));
そしていま
echo -e "Hey Moe! Woo\nwoo woo^nyuk-nyuk why#2soitenly. Hey." | java WordGenerator | sort | uniq
収量
hey
moe
nyuk
soitenly
why
woo
出力に空白行があります。叩き方はお任せします。:)