用排除法计算 SQL 表中最常见的单词

Posted

技术标签:

【中文标题】用排除法计算 SQL 表中最常见的单词【英文标题】:Counting most common word in SQL table with exclusions 【发布时间】:2014-06-24 03:37:04 【问题描述】:

我正在尝试从 mysql 数据库(使用 MYSQL 工作台)中充满文本(字符串)的表中计算最常用的单词。我通过阅读另一篇文章(由 Kickstart 编写)得到了这段代码。 此代码使用一个名为整数的单独表,其中包含从 0 到 9 的 10 列进行计数。

主表的表架构。我主要只对“文本”列的数据感兴趣。

'Id', 'int(11)', 'NO', 'PRI', '0', ''
'PostId', 'int(11)', 'YES', 'MUL', NULL, ''
'Score', 'int(11)', 'YES', 'MUL', NULL, ''
'Text', 'varchar(4000)', 'YES', '', NULL, ''
'CreationDate', 'varchar(25)', 'YES', '', NULL, ''
'UserId', 'int(11)', 'YES', 'MUL', NULL, ''
'UserDisplayName', 'varchar(255)', 'YES', '', NULL, ''

SQL 查询:

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

它列出了前 10 个单词,但它们都是短单词,例如 a、the、you、me... 等。 如何更改它以跳过某些类似的单词? 我怎样才能让它说,只计算 5 个字符及以上的单词?

整数表的架构 'i', 'int(11)', 'NO', 'PRI', NULL, ''

来自这篇文章的原始帖子和代码。我是新手,无法在上面发布任何内容,所以我不得不在这里问。determining most used set of words php mysql

非常感谢您的帮助!

【问题讨论】:

你能给我们一个你的表模式的样本吗? 如果你用表模式更新你的问题会更好 用架构更新了问题。谢谢! 感谢大家的帮助。如何使未找到的单词仍然在结果中列为 WordOccuranceCount 为 0?目前未找到的单词未列在最终结果中。感谢大家的帮助 【参考方案1】:

您应该能够在 WHERE 子句中添加另一个条件:

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

只是检查 aWord 的长度是否至少为 5 个字符,如果是,则将其包含在结果集中。 LIMIT 将应用于结果集(后过滤),您应该拥有所需的内容。

【讨论】:

谢谢!有效!如何修改它以仅显示我选择的单词列表的计数?就像我想计算“安全”或“ssl”等词出现了多少次? @user3769475:不用担心。您可以取出 LENGTH(Sub2.aWord) >= 5 并输入类似 Sub2.aWord = 'ssl' 的内容,或者如果有多个术语,则输入 Sub2.aWord IN ('security', 'ssl', 'morestuff')。但是,如果您将 LENGTH(Sub2.aWord) >= 5 留在其中,您将看不到 ssl(因为它的长度小于 5 个字符)。 有谁知道我可以如何修改此查询以仅计算具有特定时间范围的行中的单词?我有一个名为“CreationDate”的列,它是一个 DATETIME(不是上面的 VarChar 模式),其格式为 2011-01-01 00:46:21。我只想从 2011 年 9 月或 2011 年 9 月到 2011 年 10 月的计数中包含行。我知道您可以使用 WHERE Year(CreationDate) = 2013 例如,但我不知道将其放在查询中的哪个位置让它工作。谢谢! @user3769475:假设列在表中,尝试将其放在 LENGTH(Sub2.aWord) >= 5 之后;所以 LENGTH(Sub2.aWord) >= 5 AND ear(CreationDate) = 2013 感谢大家的帮助。如何使未找到的单词仍然在结果中列为 WordOccuranceCount 为 0?目前未找到的单词未列在最终结果中。感谢所有的帮助! @VBlades

以上是关于用排除法计算 SQL 表中最常见的单词的主要内容,如果未能解决你的问题,请参考以下文章

我无法在我的 SQL 代码中计算除法

sql相除的问题

SQL如何做除法

sql 查询出的结果进行除法运算,结果无法四舍五入。求助!

javascript 除法自动计算

Excel怎么进行乘法和除法