1

私が現在行っているのは、URLからテキストを解析してから、テキストをクリーンアップしてスペースで分解し、ファイルに保存することです。

私が難しいと思うのは、

複数のURLをスクレイピングする場合に備えて、一意のファイルのみを保存します。

ケース:site.com/page1から単語を削り取り、一意の単語をファイルに保存しました。site.com/page2をスクレイピングするとき、各単語がすでにファイルにあるかどうかを確認し、存在しない場合にのみ保存する必要があります。

私が考えているのは、$ word [0]を取得し、ファイルから各行を取得して、見つからないかどうかを確認して保存することです。しかし、それは数千回、数十万回の反復のようになります。

私はコードを探していませんが、それを効率的かつ高速に処理する方法を考えています。

4

5 に答える 5

2

site1から取得した一意の単語をと呼ばれるファイルにすでに保存していて、site2からとsite1.txt呼ばれる配列に単語をすでにスクレイプしていると仮定し$site2ます。ここ$site2で、ファイルに1行ずつsite2.txt保存します。ユニークな言葉:

$wordsInFile1 = file('site1.txt');
$wordsInFile1 = array_flip($wordsInFile1);

foreach($site2 as $i => $word) {
    if(isset($wordsInFile1[$word])) {
       unset($site2[$i]);
    }
}

// now $site2 contains unique words from site2 and words that are not in site1.txt
于 2012-04-10T12:34:44.147 に答える
1

私が見る限り、現在のアルゴリズムは複雑度クラスにありO(n^2)ます。単語ごとにリストを繰り返し処理していますが、それはあまり良くありません。最初にすべての単語をファイルに書き込んでから、効率的なアルゴリズムを使用してリストを並べ替えることをお勧めします。それが済んだら、重複を削除できます。たとえば、Linuxでは、次のコマンドを使用できます。

sort -u unsortedList > sortedAndCleanedList
于 2012-04-10T12:19:53.133 に答える
1

grep <word> fileかなり速く動作するはずです

または、単語のmd5という名前の空のファイルを作成し、その単語をメインファイルに追加する前に、md5(word)ファイルが存在するかどうかを確認することもできます。一部のファイルシステムでは、ディレクトリに32767を超えるファイルを許可しないことに注意してください(したがって、md5ハッシュの最初の数文字に基づいてサブディレクトリを作成する必要がある場合があります)

于 2012-04-10T12:20:35.717 に答える
1

ハッシュテーブルのように高速検索を可能にするメモリ内表現を使用して、効率的かつ高速に処理します。

ファイルからすべての単語を返す関数があり、正規化されており、句読点ではなく、空白がないとします。

$words = extract_words('Hello my dear!');

ここで-$words結果として:

array(
    'hello' => 1,
    'my'    => 1,
    'dear'  => 1,
);

次を使用して、このハッシュテーブルをファイルにすばやく保存できますvar_export

$file = 'words1.txt';
file_put_contents(sprintf('return %s;', var_export($words, TRUE)));

そして、使用してそれを読み返してくださいinclude

$words = include($file);

そのハッシュマップに単語が含まれているかどうかを確認するには、次を使用しますisset

$exist = isset($words[$word]);

ここに配列があるので、ファイル間でそれらをマージしたり、それらを差分したりすることができます。-PHPには多くの配列ベースの関数があります。PHPでやりたいのなら、それはかなり速いと思います。

より大きなリストがある場合は、通常Cで記述される数ギガバイトのワードリストに使用されるツールを使用することをお勧めします。

于 2012-04-10T12:45:00.443 に答える
0

ファイルを並べ替えて、単語を検索できます。

アイデアは、ファイルをソートしたままにしてから、任意の検索アルゴリズムを使用して、同じパターンでファイル内の既存のエントリを検索することです。既存のエントリが見つからない場合は、新しいエントリを挿入します。

ファイルをソートしておくためのコストは、ハードディスク操作が必要です。

于 2012-04-10T12:55:44.760 に答える