1

我目前所做的是,从 URL 解析文本,然后清理文本并用空格分解它们并保存到文件中。

我觉得困难的是,

仅保存唯一文件以防刮取多个 url:

案例:从 site.com/page1 抓取单词并将唯一单词保存到文件中。抓取 site.com/page2 时,我需要检查每个单词是否已经在文件中,只有在不存在时才保存。

我的想法是,取 $word[0],然后从文件中获取每一行,如果找不到,则检查并保存。但这就像成千上万次迭代。

我不是在寻找任何代码,而只是想知道如何有效和快速地处理它。

4

5 回答 5

2

我假设您已经将从 site1 获得的唯一单词存储在一个名为 的文件中,并且您site1.txt已经从 site2 刮取单词在一个名为独特的词:$site2$site2site2.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

您可以使用允许快速搜索的内存表示(如哈希表)有效且快速地处理它。

假设你有一个函数,它返回文件中的所有单词,标准化,没有标点符号,没有空格:

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

where-as$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 编写的数 GB 字表的工具。

于 2012-04-10T12:45:00.443 回答
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 回答
0

您可以对文件进行排序,然后搜索该单词。

想法是保持文件排序,然后使用任何搜索算法在文件中查找具有相同模式的现有条目。如果找不到现有条目,请插入新条目。

成本是保持文件排序需要硬盘操作。

于 2012-04-10T12:55:44.760 回答