1

私はテキストの着信ストリームを扱っています。たとえば、 米国、英国、中国、ロシア、米国、英国、中国、フランス、ドイツなどです。

それらを 3 つの単語 (またはおそらく n 単語) のシーケンスに分割し、どのシーケンスが最も頻度が高いかを分析する必要があります。上記の場合、USA、UK、中国のシーケンスが 2 回発生します。そのため、周波数が最も高くなります。

さらに、すべてのシーケンスの頻度にインデックスを付ける必要があります。問題の一部を部分的に解決するために C++ stl マップを使用しようとしましたが、解決策が洗練されているとは思えません。その理由は、stl マップを使用した 3 つの単語シーケンスでm個の一意の単語に一意にインデックスを付けるためです。数学は次のとおりです。

ixmxm + jxm + k

i、j、k は各単語への整数マップです。

上記のソリューションの問題は、連続したテキスト ストリームにあり、一意の単語の総数、つまり m を認識できません。誰でもより良いアルゴリズムを提案できますか?

4

3 に答える 3

0

もう 1 つのオプションはstd::string、マップのキーとして an を使用することです。各キーは、3 つの単語の連結である可能性があります。このようにして、各トリプルを一意に定義し、知る必要はありませんm

ただし、次のスレッドで説明されているように、2 つの文字列の順序演算子を実装し、それをマップの宣言の 3 番目のパラメーターとして渡す必要があります: std::string as a key in std::map using a compare operator .

それが役に立てば幸い!

于 2013-08-29T03:58:22.733 に答える
0
map<vector<unsigned int>, unsigned int> sequenceFrequency;
vector<unsigned int> codedWord;

void MapSequenceFrequency(unsigned int key0, unsigned int key1, unsigned int key2)
{
    codedWord[0] = key0;
    codedWord[1] = key1;
    codedWord[2] = key2;

    map<vector<unsigned int>, unsigned int>::iterator it;

    if (sequenceFrequency.find(codedWord) == sequenceFrequency.end())
        sequenceFrequency[codedWord] = 0;
    else
        sequenceFrequency[codedWord]++;
}
于 2013-08-30T14:49:30.217 に答える