找出MySQL / PHP中最流行的单词

时间:2012-06-29 18:45:36

标签: php mysql explode

我有一个包含近100,000条评论的数据库,我想检测最常用的单词(使用停用词来避免常用单词)。

我只想这样做一次,然后使用一些最流行的词来标记包含它们的注释。

你能帮我用Query和PHP代码来做这件事吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

我认为最简单的方法是:

  • 创建两个新表:keywords(id,word)和keywords_comments(keyword_id,comment_id,count)
    • keywords会保存唯一ID和您在文字中找到的关键字
    • keywords_comments为包含该关键字的每个评论之间的每个连接存储一行。在count中,您将保存此关键字在评论中出现的次数。两列keyword_id + comment_id一起形成唯一或直接主键。
  • 从数据库中检索所有评论
  • 解析所有评论并按非字符(或其他边界)拆分
  • 将这些条目写入您的表格

实施例

您有以下两条评论:

  

你好,你好吗?!

     哇,你好。我的名字是斯特凡。

现在你将迭代它们并用非字符分割它们。这将导致每个文本的以下小写单词:   - 第一篇文章:你好,你是怎么样的   - 第二个文字:哇,你好,我的名字,是,stefan

只要您解析了其中一个文本,就可以再次将其插入数据库。我想你不想在RAM上加载100.000条评论。

所以它会这样:

  • 解析第一个文本并获取上面的关键字
  • 将每个关键字写入tabke keywords(如果还没有
  • 设置从关键字到评论(keywords_comments)的引用并正确设置计数(在我们的示例中,每个单词在每个文本中只出现一次,您必须对其进行计数)。
  • 解析第二篇文字
  • ...

轻微改进

一个非常简单的改进,您可能需要使用100.000条评论,是使用计数变量或为每条评论添加新字段 has_been_analyzed 。然后,您可以通过数据库中的注释阅读它们的评论。

当我以chunkwise方式读取数据时,我通常使用计数变量,并且知道数据不能从我开始的方向改变(即它将保持一致到我目前的状态)。然后我做了类似的事情:

SELECT * FROM table ORDER BY created ASC LIMIT 0, 100
SELECT * FROM table ORDER BY created ASC LIMIT 100, 100
SELECT * FROM table ORDER BY created ASC LIMIT 200, 100
…

考虑到这只有在我们确定在我们认为已经读过的地方没有添加日期的情况下才有效。例如。使用DESC不起作用,因为可能会插入数据。那么整个偏移量就会破裂,我们会读两篇文章而不读新文章。

如果您无法确保外部计数变量保持一致,则可以添加一个新字段已分析,一旦您阅读了评论,就会将其设置为true。然后,您始终可以看到哪些评论已被阅读,哪些评论已被阅读。然后,SQL查询将如下所示:

SELECT * FROM table WHERE analyzed = 0 LIMIT 100 /* Reading chunks of 100 */

只要您不并行化工作负载(具有多个客户端或线程),这就可以正常工作。否则你必须确保读取+设置为真是atomar(同步)。