[英]Find out most popular words in MySQL / PHP
我有一个包含将近100,000条注释的数据库,并且我想检测最常用的单词(使用停用词来避免常见单词)。
我只想执行一次,然后使用一些最流行的单词标记包含它们的评论。
您可以通过查询和PHP代码帮助我吗? 谢谢!
我猜最简单的方法是:
keywords
(id,单词)和keywords_comments
_评论(keyword_id,comment_id,count)
keywords
保存唯一的ID和您在文本中找到的关键字 keywords_comments
为包含该关键字的每个注释之间的每个连接存储一行。 在count
您将节省此关键字在注释中出现的次数。 两列keyword_id + comment_id共同构成唯一键或直接构成主键。 您有以下两条评论:
你好,你好吗?!
哇,你好 我叫史蒂芬。
现在,您将遍历它们两个并按非字符将其拆分。 这将为每个文本产生以下小写单词:-第一个文本:你好,你好吗-第二个文本:哇,你好,我的名字,是,斯蒂芬
一旦解析了其中一个文本,就可以将其再次插入数据库。 我想您不想将100.000条注释加载到RAM。
所以它会这样:
keywords
如果还没有)写入tabke keywords
keywords_comments
)并正确设置计数(在我们的示例中,每个单词在每个文本中仅出现一次,您必须对其进行计数)。 您可能必须对100.000条注释使用的一个非常简单的改进是使用计数变量或为每个注释添加一个has_been_analyzed新字段。 然后,您可以从数据库中逐条阅读它们。
当我分块读取数据时,我通常会使用计数变量,并且知道数据不能从我开始的方向改变(即,直到我当前为止它将保持一致)。 然后我做类似的事情:
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 */
只要您不并行处理工作负载(具有多个客户端或线程),此方法就起作用。 否则,您将必须确保读数+设置为true是原子的(同步的)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.