计算每个单词的频率

时间:2014-03-14 16:16:54

标签: mysql

我一直在上网,并意识到MySQL并不是最好的方法,但无论如何我都在问。任何人看到或使用的查询,函数或存储过程都会在文本列中获得单词的频率。

    ID|comment
    ----------------------
 Ex. 1|I love this burger
     2|I hate this burger

     word   |  count
     -------|-------
     burger |  2
     I      |  2
     this   |  2
     love   |  1
     hate   |  1

2 个答案:

答案 0 :(得分:1)

这个解决方案似乎完成了工作(几乎逐字逐句地从this page中偷走)。它需要一个auxiliary表,其中包含从1到至少预期数量的不同单词的连续数字。这对于检查辅助表是否足够大或结果是否错误(显示没有错误)非常重要。

SELECT
    SUBSTRING_INDEX(SUBSTRING_INDEX(maintable.comment, ' ', auxiliary.id), ' ', -1) AS word,
    COUNT(*) AS frequency
FROM maintable 
JOIN auxiliary ON
    LENGTH(comment)>0 AND SUBSTRING_INDEX(SUBSTRING_INDEX(comment, ' ', auxiliary.id), ' ', -1)
    <> SUBSTRING_INDEX(SUBSTRING_INDEX(comment, ' ', auxiliary.id-1), ' ', -1)
GROUP BY word
HAVING word <> ' '
ORDER BY frequency DESC;

SQL Fiddle

这种方法效率低,因为它不能使用任何索引。

作为替代方案,我会使用一个统计表来跟踪触发器。也许用以上内容初始化统计表。

答案 1 :(得分:-1)

这样的事情应该有效。只要确保你没有传入0长度的字符串。

SET @searchString = 'burger';

SELECT 
    ID, 
    LENGTH(comment) - LENGTH(REPLACE(comment, @searchString, '')) / LENGTH(@searchString) AS count
FROM MyTable;