7

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

不知道如何去做,或者是否有更简单的方法。阅读一些建议算法的帖子。

例子:

从 24,500 条记录中找出最常用的 10 个单词。

4

5 回答 5

14

对,这就像一条狗一样运行,并且仅限于使用单个分隔符,但希望能给你一个想法。

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

这依赖于一个名为 integers 的表,其中包含一个名为 i 的列,其中 10 行的值为 0 到 9。它最多可以处理约 1000 个单词,但可以轻松更改以应对更多单词(但速度会更慢)。

于 2013-02-19T16:53:06.173 回答
4

为什么不全部用 PHP 来完成呢?步骤将是

  1. 创建字典(单词 => 计数)
  2. 用 PHP 读取数据
  3. 把它分成单词
  4. 将每个单词添加到字典中(您可能需要先小写并修剪它们)
  5. 如果已经在字典中,则增加其计数。如果字典中还没有,设置 1 作为它的值(count = 1)
  6. 迭代您的字典元素以找到最高的 10 个值

我不会在 SQL 中这样做,主要是因为它最终会更复杂。

于 2013-02-25T23:57:45.883 回答
1

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

于 2013-02-21T01:55:02.443 回答
1
SELECT `COLUMNNAME`, COUNT(*) FROM `TABLENAME` GROUP BY `COLUMNNAME`

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

于 2017-07-28T00:10:12.073 回答
0

稍微改进一下,使用 AND Sub2.aWord not in 从列表中删除停用词(停用词列表)

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
于 2016-11-14T16:09:25.280 回答