确定最常用的单词集php mysql

时间:2012-11-02 02:56:55

标签: mysql string

我正在试图弄清楚如何确定mysql数据集中最常用的单词。

不确定如何解决这个问题,或者是否有更简单的方法。阅读一些帖子,其中有些人建议使用算法。

示例:

从24,500条记录中,找出前10个用过的词。

5 个答案:

答案 0 :(得分:13)

是的,它像狗一样运行,仅限于使用单个分隔符,但希望能给你一个想法。

SELECT aWord, COUNT(*) AS WordOccuranceCount
FROM (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(concat(SomeColumn, ' '), ' ', aCnt), ' ', -1) AS aWord
FROM SomeTable
CROSS JOIN (
SELECT a.i+b.i*10+c.i*100 + 1 AS aCnt
FROM integers a, integers b, integers c) Sub1
WHERE (LENGTH(SomeColumn) + 1 - LENGTH(REPLACE(SomeColumn, ' ', ''))) >= aCnt) Sub2
WHERE Sub2.aWord != ''
GROUP BY aWord
ORDER BY WordOccuranceCount DESC
LIMIT 10

这依赖于一个名为整数的表,其中一列名为i,其中包含10行,值为0到9.它可以处理多达~1000个单词但可以轻松更改以应对更多(但会减慢甚至更多)。

答案 1 :(得分:4)

为什么不在PHP中完成所有操作?步骤将是

  1. 创建字典(word => count)
  2. 以PHP格式读取数据
  3. 将其拆分为单词
  4. 将每个单词添加到字典中(您可能希望先小写并修剪它们)
  5. 如果已经在字典中,则增加其计数。如果尚未在字典中,则将1设置为其值(count = 1)
  6. 迭代您的词典元素以找到最高的10个值
  7. 我不会在SQL中这样做主要是因为它最终会变得更复杂。

答案 2 :(得分:1)

一般的想法是找出每个字段中有多少分隔符(例如空格),并在循环中为每个这样的字段运行SUBSTRING_INDEX()。将其填充到临时表中具有额外的好处,即能够以块,并行等方式运行它。将一些SP放在一起执行此操作不应该太麻烦。

答案 3 :(得分:1)

SELECT `COLUMNNAME`, COUNT(*) FROM `TABLENAME` GROUP BY `COLUMNNAME`

非常简单且有效......:)

答案 4 :(得分:0)

略微改进,使用AND Sub2.aWord删除列表中的停用词(停用词列表)

SELECT aWord, COUNT(*) AS WordOccuranceCount
FROM (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(concat(txt_msg, ' '), ' ', aCnt), ' ', -1) AS aWord
FROM mensagens
CROSS JOIN (
SELECT a.i+b.i*10+c.i*100 + 1 AS aCnt
FROM integers a, integers b, integers c) Sub1
WHERE (LENGTH(txt_msg) + 1 - LENGTH(REPLACE(txt_msg, ' ', ''))) >= aCnt) Sub2
WHERE Sub2.aWord != '' AND Sub2.aWord not in ('a','about','above', .....)
GROUP BY aWord
ORDER BY WordOccuranceCount DESC
LIMIT 10