我有一个包含近 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/