0

500 語以上のテキスト ファイル (新聞の実際の記事など) を読み込んで、次のように検索してタグ付け <location> word <location/>し、記事全体を画面に出力する必要があります。現在ブースト正規表現を使用していますが、問題なく動作しています。リスト、配列、またはその他のデータ構造を使用して、州と主要都市のリストを取得し、それらを検索して論文と比較したいと考えています。現在、私は配列を使用していますが、何でも喜んで使用します。アイデアや手がかりはありますか?

#include <boost/regex.hpp>
#include <iostream>
#include <string>
#include <boost/iostreams/filter/regex.hpp>
#include <fstream>


using namespace std;

int main()
{
string cities[389];
string states [60];
string filename, line,city,state;
ifstream file,cityfile, statefile;
int i=0;
int j=0;
cityfile.open("c:\\cities.txt");
while (!cityfile.eof())
{

    getline(cityfile,city);
        cities[i]=city; 
        i++;
    //for (int i=0;i<500;i++)
        //file>>cities[i];
}
cityfile.close();

statefile.open("c:\\states.txt");
while (!statefile.eof())
{
    getline(statefile,state);
        states[j]=state; 
    //for (int i=0;i<500;i++)
    //cout<<states[j];
    j++;
}
statefile.close();
//4cout<<cities[4];






cout<<"Please enter the path and file name "<<endl;
cin>>filename;
file.open(filename);

while (!file.eof())
{
        while(getline(file, line)
        {


        }




        while(getline(file, line))
        {


        //string text = "Hello world";
        boost::regex re("[A-Z/]\.[A-Z\]\.|[A-Z/].*[:space:][A-Z/]|C........a");
        //boost::regex re(
        string fmt = "<locations>$&<locations\>";
        if(boost::regex_search(line, re))
            {
                 string result = boost::regex_replace(line, re, fmt);
                cout << result << endl;
            }
        /*else
            {
                cout << "Found Nothing" << endl;
            }*/

        }
}
file.close();

cin.get(),cin.get();
return 0;

}

4

2 に答える 2

1

漸近的な複雑さを求めている場合 - Aho-Corasick アルゴリズムは線形時間の複雑さ ( O(n+m)) (は入力文字列の長さ)nを提供します。m文字列で辞書を検索するため。

別の方法として、トークン化された単語を a map(値は各文字列のストリーム内の場所のリスト) に入れ、ツリー内のデータ内の各文字列を検索することもできます。複雑さは次のようになりますO(|S| * (nlogn + mlogn) )(mは検索された単語の数、nは文字列内の単語の数、|S|は平均的な単語の長さです)

于 2012-11-27T19:27:04.837 に答える