【发布时间】:2018-04-01 19:33:14
【问题描述】:
我正在分析“RawDataDescriptions”表中的数据,该表中的“描述”字段是开放式供用户输入的。
我正在寻找方法,通过短语或经常出现的字符串(包括它们出现的次数)对描述进行广泛分类。
我没有特定的单词或短语要寻找我可以使用“like”语句的地方,而是寻找字段之间的共性。
在通过其他问题寻找这一点的同时,我设法找到了一个查询,该查询针对我自己的表进行了调整,该表得到了最常见的单词(粘贴在下面),但当然,仅一个单词就几乎没有 - 如果有的话 - 洞察力描述。
是否可以进行查询以提供短语计数而不仅仅是单个单词?如果是这样,它的主要组成部分是什么?
WITH E1(N) AS
(
SELECT 1
FROM (VALUES
(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
) t(N)
),
E2(N) AS (SELECT 1 FROM E1 a CROSS JOIN E1 b),
E4(N) AS (SELECT 1 FROM E2 a CROSS JOIN E2 b)
SELECT
x.Item,
COUNT(*)
FROM RawDataDescriptions p
CROSS APPLY (
SELECT
ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
Item = LTRIM(RTRIM(SUBSTRING(p.[Description], l.N1, l.L1)))
FROM (
SELECT s.N1,
L1 = ISNULL(NULLIF(CHARINDEX(' ',p.[Description],s.N1),0)-
s.N1,4000)
FROM(
SELECT 1 UNION ALL
SELECT t.N+1
FROM(
SELECT TOP (ISNULL(DATALENGTH(p.[Description])/2,0))
ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM E4
) t(N)
WHERE SUBSTRING(p.[Description] ,t.N,1) = ' '
) s(N1)
) l(N1, L1)
) x
WHERE x.item <> ''
GROUP BY x.Item
ORDER BY COUNT(*) DESC
*编辑 - 不可行。替代的期望结果:
示例表
Id | Description
---+--------------------------
01 | Customer didn't like it
02 | Person liked it
03 | Person didn't like it
04 | Client didn't like it
05 | person liked it
@Parameter = 3
想要的结果:
string | count
-----------------+-------
didn't like it | 3
Person liked it | 2
编辑 2** 原来的问题是可行的 - 查看答案
【问题讨论】:
-
我认为你做不到。可以为单个单词做它,因为很清楚单词是什么。但是定义一个短语....它可以是两个词,三个或十个。您必须逐行解析多个单词的所有可能组合。对于仅包含几个单词的条目而言,这实际上可能有数千种可能性。
-
如果我做了一些与 OP 中的查询类似的事情,但只使用 3 个单词而不是一个单词呢?
-
你可以这样做。您将拥有 NumberOfWords - 2 作为每行可能的短语数。
-
如何编码来调整字数?
-
你不能仅仅修改这个来做到这一点。您发布的代码使用空格作为分隔符将字符串解析为行。你必须从头开始,把你的价值观变成三个词组。您还需要决定如何处理只有一两个单词的短语。你用这些做什么?
标签: sql sql-server tsql