我有一个包含近100,000条评论的数据库,我想检测最常用的单词(使用停用词来避免常用单词)。
我只想这样做一次,然后使用一些最流行的词来标记包含它们的注释。
你能帮我用Query和PHP代码来做这件事吗? 谢谢!
答案 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条评论。
所以它会这样:
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(同步)。