如何在大型网页上获取独特的单词(至少是一个独特的单词样本)?

时间:2015-12-26 22:58:43

标签: javascript jquery parsing bigdata

我正在尝试处理非常大的页面的可见文本,例如,整个Orwell's "1984" on this page,但是当我尝试以下操作时,我的Chrome控制台似乎崩溃了。

var script = document.createElement('script');
script.src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js";
document.getElementsByTagName('head')[0].appendChild(script);
var allWords = $(document.body).children(":visible").text().split(' ');
var uniqueWords = allWords.filter(function(elem, i, array){ return array.indexOf(elem) === i });

以上操作使我的Chrome标签在上次操作时无响应(我停止输入我输入的新命令至少一分钟)。注意:代码段的第一部分只是attaches JQuery to the page

你会如何尝试像这样处理大字符串,更快?你认为我应该从allWords中随机抽样,只将过滤函数应用于这个较小的字符串。

1 个答案:

答案 0 :(得分:1)

执行最后一行后Chrome标签挂起的原因是算法的复杂性。您可以将每个单词添加到Set

,而不是在每个单词上调用var uniqueWords = new Set(); allWords.forEach(function (word) { uniqueWords.add(word) });
Object.keys

如果需要相同代码的ES5版本,可以使用辅助对象作为数据存储。对象键本质上是唯一的,因此您可以使用单词作为键和任何您想要的值来填充空对象,然后使用var uniqueWordsHash = {}; allWords.reduce(function (hash, word) { hash[word] = null; return hash; }, uniqueWordsHash); var uniqueWordsArray = Object.keys(uniqueWordsHash); 方法

提取单词
<script>
    function getRandomNumber(min, max) {
      return Math.floor(Math.random() * (max - min + 1)) + min;
    }

    // The variable 'startTime' is synchronized with the server
    var startTime=parseInt(<?php echo date("now")?>);

    setInterval(function() {
        startTime++;
        if(startTime%30==0) document.write(parseInt(getRandomNumber(0, 14)).toString()+"<br>");
    }, 1000);
</script>