【问题标题】:Javascript - Most efficient way to search thousand texts for thousands of words?Javascript - 在数千个文本中搜索数千个单词的最有效方法?
【发布时间】:2017-09-09 21:09:32
【问题描述】:

语言本身并不重要,但我想我会坚持使用 Javascript。

基本上,我每个月都有数千个“cmets”,并希望通过在这些 cmets 中搜索 10,000 个单词来通过自动化进行一个天真的幸福“评估”(每条评论的平均字数为 21 个单词,到目前为止的所有内容)。

公式的工作方式(从 Hedonometer 借用)- 取文本中每个单词的“幸福”分数(如果在 10k 列表中找到)并取平均值。

我会测试一些东西,也许会在此处编辑结果,但我什至不确定从哪里开始。似乎是非常繁重的数据提升(当然,每个评论只需要完成一次)——也许它更适合 R 或 SQL(可能不是),但不确定。

我相信这个问题有时被称为“词袋”或“词频饱和”。

【问题讨论】:

  • “最高效”取决于一系列因素......
  • 是的,阅读并了解到快速字符串搜索方法非常复杂。唔。也许我会在维基百科上一些更简单的方法,看看处理时间是否可以接受。

标签: javascript algorithm search text


【解决方案1】:

你可以像这样(缩写)用你的话创建一​​个哈希表:

let wordRanks = {'hate':-100,'love':100,'ok':10};

然后有一个这样的字符串,并把它拆分成单词。

let str = `I hate love it's just ok`;
let words = str.split(' ');

然后你可以遍历单词并获得分数:

let commentScore = 0;
words.forEach(function(word){
  if(wordRanks[word]){
    commentScore += parseInt(wordRanks[word])
  }
});
console.log(commentScore); //should be 10

使用哈希表进行查找的计算成本不应该很高。应该可以,尽管您可能必须更好地拆分单词以删除尾随标点符号,因为我在初始代码中的 love 后面有一个逗号,它给出了错误的结果,因为没有哈希表匹配“love”,

【讨论】:

  • 嗯,很有趣。我会尝试测试一下。问题是,根据 Hedonometer 期刊论文,他们没有对单词分数求和,而是取平均值。因此,在您的虚构示例中,平均值为 3.33 (10/3) - 实际上,“分数”这个词是从 1 到 10,所以没有负数。肯定会尝试这个,看看从时间的角度来看是否可行,谢谢。
  • 很酷,只要您了解循环和哈希表背后的代码,希望您能够将该方法适应于您的评分系统。但是,如果您正在处理浮点数,则 parseInt 也可能是 parseFloat。
  • 这种方法的更新:它的工作速度比我预期的要快得多。在一台普通的计算机上,它在 9 秒内对 1000 个 21-avg-word-cmets 的 10k 单词列表进行应用和评分。可能不是最优化的方法,但肯定有效。每月大约有 2-3k cmets,因此大约需要 18-27 秒。只有“不优雅”的部分是在 Javascript 中获取单词列表。 10k 列表是静态的,所以我只是使用一些处理将 HUGE 列表放在一个 Javascript 行上,但想知道是否有更好的方法来维护这个列表,通过 SQL 或其他格式。谢谢!
  • @user45867:为什么不将单词列表存储在文件中并让程序在运行时加载它?
【解决方案2】:

我肯定会选择Python's Natural Language Toolkit (NLTK),它带有一组功能,可以让您的生活更轻松,例如文本频率、删除重复项、删除停用词、查找同义词等,其想法是减小大小尽可能多地对您的文本进行情感分析。

在一个类似的项目中,我的方法是:

  1. 删除中性词、代词、介词、限定词、名称等。
  2. 删除重复项。
  3. 在我进入文本时检查单词同义词并将它们从文本的其余部分中删除。
  4. 为段落动态创建情绪阈值分数,因此一旦达到该分数,我将停止处理该段落并继续处理下一个段落,整个文本也是如此。

希望这行得通!

【讨论】:

  • 谢谢 - 该网站的指南也很棒。是的,我并不想完全重新发明轮子。我会通读一遍。
  • 只是一个注释,以防您做类似的事情,如果您删除同义词或重复项,它们无论如何都应该添加到分数中,所以如果您从段落中删除“笑”这个词 6 次并且不要计算六次迭代,您很可能对该特定段落的得分错误。 NLTK 也有一套很好的分析上下文的工具,它非常有用,像“哭”这样的词可以表示悲伤或愤怒,所以上下文很重要。
  • 我正在尝试复制 Hedonometer 的方法,只是因为从他们自己的内部测试来看,它似乎很可靠。是的,他们相应地计算重复或三次。他们不考虑上下文。我当然不会追求精确的准确性(人工评估可以做到这一点)——更多的是通过分数/基本分类的初始通过。但是,是的,即使是这种平均单词幸福分数的“简单”模型——在技术上也很难实现,至少现在对我来说是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 2018-06-24
相关资源
最近更新 更多