我需要你的帮助。
我尝试将手动创建的特定关键字查找与事实注释表相匹配。目的:试图对这些评论进行分类。
示例
- 评论:比奥迪的同等车型动力大得多
- 关键词列表中的关键词:奥迪
- 关键字列表中的类别:竞争对手
我试过类似的东西
SELECT
FC.comment_id, KWM.keyword, KWM.category
FROM
dbo.factcomments FC
INNER JOIN
(SELECT
keywordmatcher = '%[,. ]' + keyword + '[ .,]%',
keyword,
category
FROM
dbo.keywordlist) KWM ON FC.comment LIKE KWM.keywordmatcher
也许这是一个糟糕的例子,但我只想要特定的匹配-->如果关键字是事实注释中另一个单词的一部分(例如"part"而不是"分开"(,则不需要匹配。
因为我的第一次尝试与字符串开头/结尾的关键字不匹配,我做了一件非常糟糕的事情:
SELECT
FC.comment_id, KWM.keyword, KWM.category
FROM
dbo.factcomments FC
INNER JOIN
(SELECT
keyword,
category
FROM
dbo.keywordlist) KWM ON FC.comment LIKE '%[,. ]' + KWM.keyword + '[ .,]%'
OR FC.comment LIKE KWM.keyword + '[ .,]%'
OR FC.comment LIKE '%[,. ]' + KWM.keyword
我知道。。。
除此之外,我还想检测那些有"!"、"?"、"、"-"的评论或者在这些关键词之前或之后的"_"——有什么聪明的方法吗?
事实上,我想要任何在关键字之前或之后没有单词字符的评论,任何其他字符都可以。
在JOIN条件下,用空格字符替换((FC.Comment
中的所有非字母数字字符,并用空格将其包围。类似这样的东西:
' '+REPLACE(FC.Comment, ...)+' '
然后这样做你的LIKE比较:
LIKE '% '+KWM.Keyword+' %'
可能有不同的方法。
declare @comment varchar(255)=concat(' ','A lot more power than the equivalent from Audi.',' ')
declare @keyword varchar(50)='Audi'
DECLARE @allowedStrings VARCHAR(100)
DECLARE @teststring VARCHAR(100)
SET @allowedStrings = '><()!?@_-./?!*&^%$#()~'
;WITH CTE AS
(
SELECT SUBSTRING(@allowedStrings, 1, 1) AS [String], 1 AS [Start], 1 AS [Counter]
UNION ALL
SELECT SUBSTRING(@allowedStrings, [Start] + 1, 1) AS [String], [Start] + 1, [Counter] + 1
FROM CTE
WHERE [Counter] < LEN(@allowedStrings)
)
SELECT @comment = REPLACE(@comment, CTE.[String], '') FROM CTE
随意更改@comment
变量并检查结果
SELECT
@comment as Comment , @keyword as KeyWord,
iif(substring(@comment,PATINDEX(concat('%',@keyword,'%'),@comment)-1,len(@keyword)+2)=' Audi ',1,0) as isMatch
这是从https://stackoverflow.com/a/29162400/10735793