Javascript WebWorkers可以用来计算很长页面上的词频吗?

Javascript WebWorkers可以用来计算很长页面上的词频吗?,javascript,frequency,web-worker,Javascript,Frequency,Web Worker,我正在编写一个基于浏览器的(Javascript和jQuery)语言分析工具,它从HTML中提取文本,然后提取语言单位,如句子、单词等 要导入文本,PHP后端会捕获给定的URL并清理生成的HTML。然后将HTML插入界面中的div#container,如下所示: 当源HTML页面很长时,我遇到了一些困难。在接口的DOM中读取和插入这样一个页面似乎不会引起问题(尽管需要一段时间) 但是,如果页面很长,则在spidered内容上运行词频算法的速度非常慢。比如说,如果这一页接近10万字,它几乎会让事

我正在编写一个基于浏览器的(Javascript和jQuery)语言分析工具,它从HTML中提取文本,然后提取语言单位,如句子、单词等

要导入文本,PHP后端会捕获给定的URL并清理生成的HTML。然后将HTML插入界面中的
div#container
,如下所示:

当源HTML页面很长时,我遇到了一些困难。在接口的
DOM
中读取和插入这样一个页面似乎不会引起问题(尽管需要一段时间)

但是,如果页面很长,则在spidered内容上运行词频算法的速度非常慢。比如说,如果这一页接近10万字,它几乎会让事情陷入停顿

因此,我看到了一些选择:

  • 更改PHP spider,使其截断源文档或将其细分为多个文档
  • 更改词频算法,使其不那么精确,并对单词分布进行采样,而不是完全记录
  • 试试这个新型的Web Worker,看看我是否可以将计算分布到多个后台进程
  • 在我看来,(3)正是网络工作者设计要做的事情。我想象着将spidered内容分割成块,然后为每个块分配一个Web工作者。可以从Web Worker返回每个区块的词频配置文件,然后汇总并呈现到图表中


    在我尝试这一点之前,我希望我能从其他可能曾经与网络工作者共事过的人那里得到一次精神检查。首先,我想知道有效地分割
    div#container
    的内容是否会成为一个问题——我想这将涉及到对
    div#container

    Web workers下的DOM树的某种遍历,这肯定是一个可行的选择,但折衷的办法是,你不能保证跨浏览器的兼容性。将内容分成若干块并利用setTimeout,看看这是否会有所不同,这可能是值得的。它将防止浏览器锁定,并防止出现任何长时间运行的脚本警告。尼古拉斯·扎卡斯不久前写了一篇关于这类事情的博客:

    他建议的方法是:

    function chunk(array, process, context){
      var items = array.concat();   //clone the array
      setTimeout(function(){
        var item = items.shift();
        process.call(context, item);
    
        if (items.length > 0){
            setTimeout(arguments.callee, 100);
        }
      }, 100);
    }
    
    就我个人而言,我不认为100毫秒的延迟是必要的;我在其他地方看到过,您可以设置0毫秒的延迟,因为这足以中断长时间运行的脚本,并防止浏览器锁定


    如果这不能改善情况,那么是的,网络工作者将是一条出路。

    谢谢Gary,我将尝试一下这种方法,看看效果如何。我会在这里回复。。。我想知道的一件事是
    被调用方在这里的用法--
    不是已经被弃用了吗?是的,我相信是的。您可以始终使用命名函数-so
    setTimeout(function wrap(){…})setTimeout
    调用中调用code>,然后只调用
    wrap
    而不是
    参数。被调用方