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

标签 php mysql explode

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

我只想执行一次此操作,然后使用一些最流行的单词来标记包含它们的评论。

您能帮助我使用查询和 PHP 代码来执行此操作吗? 谢谢!

最佳答案

我认为最简单的方法是:

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

示例

您有以下两条评论:

Hello, how are you?!

Wow, hello. My name is Stefan.

现在您将迭代它们并按非字符分割它们。这将导致每个文本出现以下小写单词: - 第一条短信:你好,怎么样,是,你 - 第二条文字:哇,你好,我的名字,是,斯特凡

解析完其中一段文本后,您就可以将其再次插入数据库中。我猜您不想将 100.000 条评论加载到 RAM 中。

所以会这样:

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

小幅改进

对于 100,000 条评论,您可能需要使用一个非常简单的改进,即使用计数变量或为每条评论添加一个新字段has_been_analyzed。然后您可以从数据库中逐条评论地阅读它们。

当我按 block 读取数据时,我通常使用计数变量,并且知道数据不能从我开始的方向改变(即,直到我当前所在的点为止,它都会保持一致)。然后我做了类似的事情:

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 不起作用,因为可能会插入数据。然后整个偏移量就会中断,我们会将一篇文章读两遍,而永远不会读新文章。

如果您无法确保外部计数变量保持一致,您可以添加一个新字段analyzed,您在阅读评论后立即将其设置为 true。然后您可以随时查看哪些评论已被阅读,哪些评论尚未阅读。 SQL 查询将如下所示:

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

只要您不并行化工作负载(使用多个客户端或线程),此方法就有效。否则,您必须确保读取+设置 true 是atomar(同步)。

关于php - 找出 MySQL/PHP 中最流行的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11267329/

相关文章:

javascript - 获取被点击的 anchor 标签的id

php - json_decode() 期望参数 1 为字符串,给定数组?

mysql - TRUNCATE table 仅当它存在时(以避免错误)

php - 在 PHP 中分解字符串

PHP explode 并赋值给一个多维数组

php - 用双引号 PHP 给出数组值

php - 事件记录查询结果未显示所有具有表连接的字段

php - 从 MYSQL 在 PHP 中显示图像?

php - Laravel - 加入具有复合主键的表

php 执行在特定行退出