sql 拆字匹配

小小骨头 2018-01-19 11:18:00
1.拆分文字:百度一下我就知道
2.拆分成:
引用

3.匹配文字:

a.百富美我是谁
b.百度一下我就知道
c.百度一下我就什么
d.谷歌一下我就知道

4.需要的结果是:
设定100%的匹配度,结果是b
设定60%的匹配度,结果是b,c,d
...全文
1016 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2018-01-22
  • 打赏
  • 举报
回复
首选不在数据库中实现,这种东东程序中应该更快 数据库中的实现,可以参考全文检索的方法:data 本身就做分拆存储,这样检索的时候只需要把检索字符串分拆后与 data join 做 COUNT 就行了 data 分拆存储还可以考虑按字分表或分区,这更有利于检索
小小骨头 2018-01-22
  • 打赏
  • 举报
回复
现在的测试结果是1500*120000,1小时45分可以跑完。
小小骨头 2018-01-22
  • 打赏
  • 举报
回复
引用 19 楼 z10843087 的回复:
这种功能尽量在程序里面去实现比较好,为什么选择在数据库中来做
客户不要界面,大神您的代码能解释一下么,看了大概。
OwenZeng_DBA 2018-01-22
  • 打赏
  • 举报
回复
这种功能尽量在程序里面去实现比较好,为什么选择在数据库中来做
小小骨头 2018-01-22
  • 打赏
  • 举报
回复
引用 12 楼 roy_88 的回复:
用T-SQL写一方法给你参照 改改,把拆分条件放在CTE里去处理 e.g.
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
  
if not object_id(N'Tempdb..#Data') is null
    drop table #Data
Go
Create table #Data([Code] nvarchar(21),[Content] nvarchar(28))
Insert #Data
select N'a',N'百富美我是谁' union all
select N'b',N'百度一下我就知道' union all
select N'c',N'百度一下我就什么' union all
select N'd',N'谷歌一下我就知道'
GO
DECLARE @Str NVARCHAR(100) ='百度一下下我就知道'
      , @Len TINYINT       =0;


SET @Len=LEN(@Str);
WITH TNum (Num)
AS
(
    SELECT TOP 100
        ROW_NUMBER() OVER (ORDER BY RAND())
    FROM syscolumns AS a
       , syscolumns AS b)
   , TNum2 (Condition)
AS
(
    SELECT DISTINCT
        SUBSTRING(@Str, Num, 1)
    FROM TNum
    WHERE Num<=@Len)
SELECT *
     , CAST(b.CountQty * 100.0 / (SELECT COUNT(*) FROM TNum2) AS NUMERIC(5, 2)) AS 权重
FROM #Data AS DT
     CROSS APPLY
(SELECT COUNT(*)
 FROM TNum2
 WHERE DT.[Content] LIKE '%'+Condition+'%') b(CountQty)
WHERE b.CountQty>0
ORDER BY 4 DESC;
大神这个方案快了很多了,继续测试中...
nettman 2018-01-21
  • 打赏
  • 举报
回复
关注,学习
日月路明 2018-01-21
  • 打赏
  • 举报
回复
做个记号,大神的思路不错
  • 打赏
  • 举报
回复
mark一下,思路值得学习,我早就想写类似的语句了,总找不到方法
  • 打赏
  • 举报
回复
学习一下,谢谢
中国风 2018-01-20
  • 打赏
  • 举报
回复
用T-SQL写一方法给你参照
改改,把拆分条件放在CTE里去处理

e.g.
use Tempdb
go
--> --> 中国风(Roy)生成測試數據

if not object_id(N'Tempdb..#Data') is null
drop table #Data
Go
Create table #Data([Code] nvarchar(21),[Content] nvarchar(28))
Insert #Data
select N'a',N'百富美我是谁' union all
select N'b',N'百度一下我就知道' union all
select N'c',N'百度一下我就什么' union all
select N'd',N'谷歌一下我就知道'
GO
DECLARE @Str NVARCHAR(100) ='百度一下下我就知道'
, @Len TINYINT =0;


SET @Len=LEN(@Str);
WITH TNum (Num)
AS
(
SELECT TOP 100
ROW_NUMBER() OVER (ORDER BY RAND())
FROM syscolumns AS a
, syscolumns AS b)
, TNum2 (Condition)
AS
(
SELECT DISTINCT
SUBSTRING(@Str, Num, 1)
FROM TNum
WHERE Num<=@Len)
SELECT *
, CAST(b.CountQty * 100.0 / (SELECT COUNT(*) FROM TNum2) AS NUMERIC(5, 2)) AS 权重
FROM #Data AS DT
CROSS APPLY
(SELECT COUNT(*)
FROM TNum2
WHERE DT.[Content] LIKE '%'+Condition+'%') b(CountQty)
WHERE b.CountQty>0
ORDER BY 4 DESC;
中国风 2018-01-20
  • 打赏
  • 举报
回复
这类权重只能交给全文检索或数据量大要用第三方coreseek等去实现 直接用T-SQL去处理,性能低不可取,除非是处理数据,不用考虑性能,数据量不大可考虑用CLR 函数
RINK_1 2018-01-20
  • 打赏
  • 举报
回复


if OBJECT_ID(N'tempdb.dbo.#T') is not null
drop table #T
go

create table #T(col nvarchar(max))

insert into #T
select '百富美我是谁' union all
select '百度一下我就知道' union all
select '百度一下我就什么' union all
select '谷歌一下我就知道' 

declare @str nvarchar(max)

set @str='百度一下我就知道'

select col,(COUNT(*)*1.0)/MAX(qty_char) as mathc_percent
from
(select COUNT(1) over (partition by 1) as qty_char,SUBSTRING(@str,number,1) as single_char 
from master.dbo.spt_values where LEN(@str)>=number and type='p' and number>0) as A
join
(select col,SUBSTRING(col,number,1) as match_char
from master.dbo.spt_values A 
join #T B ON LEN(col)>=number 
where type='p' and number>0) as B on A.single_char=B.match_char
group by col
shoppo0505 2018-01-19
  • 打赏
  • 举报
回复
计算操作没有问题,我想问下源数据有多少? 源数据的数据量影响算法。
小小骨头 2018-01-19
  • 打赏
  • 举报
回复
引用 6 楼 zjcxc 的回复:
全文检索干的事,这个有很多细节的,要看你怎么定义 就算你只是简单的用单字在要搜索的字符串中的匹配个数来算百分比,也还要考虑重复字,字符顺序的问题吧:
恩,顺序不考虑,重复字,我去重过了。有更好的思路吗?
小小骨头 2018-01-19
  • 打赏
  • 举报
回复
对,大神的实现没问题,效率不行。1000×15000条数据对比,一个小时都没跑完。有更好的思路吗?
zjcxc 2018-01-19
  • 打赏
  • 举报
回复
加上你说的数据量,如果要效率的话,个人觉得不能简单的用 SQL 来实现
zjcxc 2018-01-19
  • 打赏
  • 举报
回复
全文检索干的事,这个有很多细节的,要看你怎么定义 就算你只是简单的用单字在要搜索的字符串中的匹配个数来算百分比,也还要考虑重复字,字符顺序的问题吧:
二月十六 2018-01-19
  • 打赏
  • 举报
回复
引用 4 楼 yinjiale 的回复:
大神能解释一下思路吗
把字符串按照单个单个的字符存到临时表中,然后字符串的临时表进行关联查询,查询出来多少个一样的字符,比如5个,然后再除以字符串总长度10,就是匹配的百分比
小小骨头 2018-01-19
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
CREATE FUNCTION dbo.MatchPercent
 (
     @SplitString nvarchar(max) 
 )
 RETURNS @SplitStringsTable TABLE  
 (
     [id] int identity(1,1),
     [value] nvarchar(max)
 )
 AS
 BEGIN
     DECLARE @CurrentIndex int;
     DECLARE @len INT = len(@SplitString);
	 DECLARE @ReturnText NVARCHAR(20)

     SELECT @CurrentIndex=1;
     WHILE(@CurrentIndex<=@len)
         BEGIN
                 SELECT @ReturnText=substring(@SplitString,1,1);
                 INSERT INTO @SplitStringsTable([value]) VALUES(@ReturnText);
				 SET @SplitString = STUFF(@SplitString,1,1,'')
				 SET @CurrentIndex = @CurrentIndex+1				 
             END
     RETURN;
 END
GO
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([col1] nvarchar(21),[col2] nvarchar(28))
Insert #T
select N'a',N'百富美我是谁' union all
select N'b',N'百度一下我就知道' union all
select N'c',N'百度一下我就什么' union all
select N'd',N'谷歌一下我就知道'
Go
--测试数据结束
DECLARE @str NVARCHAR(max)='百度一下我就知道'
SELECT  * ,
        ( CONVERT(FLOAT, ( SELECT   COUNT(1)
                           FROM     dbo.MatchPercent(col2) t1
                                    JOIN dbo.MatchPercent(@str) t2 ON t2.id = t1.id
                                                              AND t2.value = t1.value
                         )) / ( SELECT  COUNT(1)
                                FROM    dbo.MatchPercent(@str)
                              ) ) AS MatchPercent
FROM    #T
然后按照MatchPercent加where条件搜索
大神能解释一下思路吗
二月十六 2018-01-19
  • 打赏
  • 举报
回复
CREATE FUNCTION dbo.MatchPercent
(
@SplitString nvarchar(max)
)
RETURNS @SplitStringsTable TABLE
(
[id] int identity(1,1),
[value] nvarchar(max)
)
AS
BEGIN
DECLARE @CurrentIndex int;
DECLARE @len INT = len(@SplitString);
DECLARE @ReturnText NVARCHAR(20)

SELECT @CurrentIndex=1;
WHILE(@CurrentIndex<=@len)
BEGIN
SELECT @ReturnText=substring(@SplitString,1,1);
INSERT INTO @SplitStringsTable([value]) VALUES(@ReturnText);
SET @SplitString = STUFF(@SplitString,1,1,'')
SET @CurrentIndex = @CurrentIndex+1
END
RETURN;
END
GO


--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([col1] nvarchar(21),[col2] nvarchar(28))
Insert #T
select N'a',N'百富美我是谁' union all
select N'b',N'百度一下我就知道' union all
select N'c',N'百度一下我就什么' union all
select N'd',N'谷歌一下我就知道'
Go
--测试数据结束
DECLARE @str NVARCHAR(max)='百度一下我就知道'
SELECT * ,
( CONVERT(FLOAT, ( SELECT COUNT(1)
FROM dbo.MatchPercent(col2) t1
JOIN dbo.MatchPercent(@str) t2 ON t2.id = t1.id
AND t2.value = t1.value
)) / ( SELECT COUNT(1)
FROM dbo.MatchPercent(@str)
) ) AS MatchPercent
FROM #T





然后按照MatchPercent加where条件搜索
加载更多回复(1)
数据描述 涉及内容包括但不限于:中英文敏感词、语言检测、中外手机/电话归属地/运营商查询、名字推断性别、手机号抽取、身份证抽取、邮箱抽取、中日文人名库、中文缩写库、拆字词典、词汇情感值、停用词、反动词表、暴恐词表、繁简体转换、英文模拟中文发音、汪峰歌词生成器、职业名称词库、同义词库、反义词库、否定词库、汽车品牌词库、汽车零件词库、连续英文切割、各种中文词向量、公司名字大全、古诗词库、IT词库、财经词库、成语词库、地名词库、历史名人词库、诗词词库、医学词库、饮食词库、法律词库、汽车词库、动物词库、中文聊天语料、中文谣言数据、百度中文问答数据集、句子相似度匹配算法集合、bert资源、文本生成&摘要相关工具、cocoNLP信息抽取工具、国内电话号码正则匹配、清华大学XLORE:中英文跨语言百科知识图谱、清华大学人工智能技术系列报告、自然语言生成、NLU太难了系列、自动对联数据及机器人、用户名黑名单列表、罪名法务名词及分类模型、微信公众号语料、cs224n深度学习自然语言处理课程、中文手写汉字识别、中文自然语言处理 语料/数据集、变量命名神器、分词语料库+代码、任务型对话英文数据集、ASR 语音数据集 + 基于深度学习的中文语音识别系统、笑声检测器、Microsoft多语言数字/单位/如日期时间识别包、中华新华字典数据库及api(包括常用歇后语、成语、词语和汉字)、文档图谱自动生成、SpaCy 中文模型、Common Voice语音识别数据集新版、神经网络关系抽取、基于bert的命名实体识别、关键词(Keyphrase)抽取包pke、基于医疗领域知识图谱的问答系统、基于依存句法与语义角色标注的事件三元组抽取、依存句法分析4万句高质量标注数据、cnocr:用来做中文OCR的Python3包、中文人物关系知识图谱项目、中文nlp竞赛项目及代码汇总、中文字符数据、speech-aligner: 从“人声语音”及其“语言文本”产生音素级别时间对齐标注的工具、AmpliGraph: 知识图谱表示学习(Python)库:知识图谱概念链接预测、Scattertext 文本可视化(python)、语言/知识表示工具:BERT & ERNIE、中文对比英文自然语言处理NLP的区别综述、Synonyms中文近义词工具包、HarvestText领域自适应文本挖掘工具(新词发现-情感分析-实体链接等)、word2word:(Python)方便易用的多语言词-词对集:62种语言/3,564个多语言对、语音识别语料生成工具:从具有音频/字幕的在线视频创建自动语音识别(ASR)语料库、构建医疗实体识别的模型(包含词典和语料标注)、单文档非监督的关键词抽取、Kashgari中使用gpt-2语言模型、开源的金融投资数据提取工具、文本自动摘要库TextTeaser: 仅支持英文、人民日报语料处理工具集、一些关于自然语言的基本模型、基于14W歌曲知识库的问答尝试–功能包括歌词接龙and已知歌词找歌曲以及歌曲歌手歌词三角关系的问答、基于Siamese bilstm模型的相似句子判定模型并提供训练数据集和测试数据集、用Transformer编解码模型实现的根据Hacker News文章标题自动生成评论、用BERT进行序列标记和文本分类的模板代码、LitBank:NLP数据集——支持自然语言处理和计算人文学科任务的100部带标记英文小说语料、百度开源的基准信息抽取系统、虚假新闻数据集、Facebook: LAMA语言模型分析,提供Transformer-XL/BERT/ELMo/GPT预训练语言模型的统一访问接口、CommonsenseQA:面向常识的英文QA挑战、中文知识图谱资料、数据及工具、各大公司内部里大牛分享的技术文档 PDF 或者 PPT、自然语言生成SQL语句(英文)、中文NLP数据增强(EDA)工具、英文NLP数据增强工具 、基于医药知识图谱的智能问答系统、京东商品知识图谱、基于mongodb存储的军事领域知识图谱问答项目、基于远监督的中文关系抽取、语音情感分析、中文ULMFiT-情感分析-文本分类-语料及模型、一个拍照做题程序、世界各国大规模人名库、一个利用有趣中文语料库 qingyun 训练出来的中文聊天机器人、中文聊天机器人seqGAN、省市区镇行政区划数据带拼音标注、教育行业新闻语料库包含自动文摘功能、开放了对话机器人-知识图谱-语义理解-自然语言处理工具及数据、中文知识图谱:基于百度百科中文页面-抽取三元组信息-构建中文知识图谱、masr: 中文语音识别-提供预训练模型-高识别率、Python音频数据增广库、中文全词覆盖BERT及两份阅读理解数据、ConvLab:开源多域端到端对话系统平台、中文自然语言处理数据集、基于最新版本rasa搭建的对话系统、基于
涉及内容包括但不限于:中英文敏感词、语言检测、中外手机/电话归属地/运营商查询、名字推断性别、手机号抽取、身份证抽取、邮箱抽取、中日文人名库、中文缩写库、拆字词典、词汇情感值、停用词、反动词表、暴恐词表、繁简体转换、英文模拟中文发音、汪峰歌词生成器、职业名称词库、同义词库、反义词库、否定词库、汽车品牌词库、汽车零件词库、连续英文切割、各种中文词向量、公司名字大全、古诗词库、IT词库、财经词库、成语词库、地名词库、历史名人词库、诗词词库、医学词库、饮食词库、法律词库、汽车词库、动物词库、中文聊天语料、中文谣言数据、百度中文问答数据集、句子相似度匹配算法集合、bert资源、文本生成&摘要相关工具、cocoNLP信息抽取工具、国内电话号码正则匹配、清华大学XLORE:中英文跨语言百科知识图谱、清华大学人工智能技术系列报告、自然语言生成、NLU太难了系列、自动对联数据及机器人、用户名黑名单列表、罪名法务名词及分类模型、微信公众号语料、cs224n深度学习自然语言处理课程、中文手写汉字识别、中文自然语言处理 语料/数据集、变量命名神器、分词语料库+代码、任务型对话英文数据集、ASR 语音数据集 + 基于深度学习的中文语音识别系统、笑声检测器、Microsoft多语言数字/单位/如日期时间识别包、中华新华字典数据库及api(包括常用歇后语、成语、词语和汉字)、文档图谱自动生成、SpaCy 中文模型、Common Voice语音识别数据集新版、神经网络关系抽取、基于bert的命名实体识别、关键词(Keyphrase)抽取包pke、基于医疗领域知识图谱的问答系统、基于依存句法与语义角色标注的事件三元组抽取、依存句法分析4万句高质量标注数据、cnocr:用来做中文OCR的Python3包、中文人物关系知识图谱项目、中文nlp竞赛项目及代码汇总、中文字符数据、speech-aligner: 从“人声语音”及其“语言文本”产生音素级别时间对齐标注的工具、AmpliGraph: 知识图谱表示学习(Python)库:知识图谱概念链接预测、Scattertext 文本可视化(python)、语言/知识表示工具:BERT & ERNIE、中文对比英文自然语言处理NLP的区别综述、Synonyms中文近义词工具包、HarvestText领域自适应文本挖掘工具(新词发现-情感分析-实体链接等)、word2word:(Python)方便易用的多语言词-词对集:62种语言/3,564个多语言对、语音识别语料生成工具:从具有音频/字幕的在线视频创建自动语音识别(ASR)语料库、构建医疗实体识别的模型(包含词典和语料标注)、单文档非监督的关键词抽取、Kashgari中使用gpt-2语言模型、开源的金融投资数据提取工具、文本自动摘要库TextTeaser: 仅支持英文、人民日报语料处理工具集、一些关于自然语言的基本模型、基于14W歌曲知识库的问答尝试--功能包括歌词接龙and已知歌词找歌曲以及歌曲歌手歌词三角关系的问答、基于Siamese bilstm模型的相似句子判定模型并提供训练数据集和测试数据集、用Transformer编解码模型实现的根据Hacker News文章标题自动生成评论、用BERT进行序列标记和文本分类的模板代码、LitBank:NLP数据集——支持自然语言处理和计算人文学科任务的100部带标记英文小说语料、百度开源的基准信息抽取系统、虚假新闻数据集、Facebook: LAMA语言模型分析,提供Transformer-XL/BERT/ELMo/GPT预训练语言模型的统一访问接口、CommonsenseQA:面向常识的英文QA挑战、中文知识图谱资料、数据及工具、各大公司内部里大牛分享的技术文档 PDF 或者 PPT、自然语言生成SQL语句(英文)、中文NLP数据增强(EDA)工具、英文NLP数据增强工具 、基于医药知识图谱的智能问答系统、京东商品知识图谱、基于mongodb存储的军事领域知识图谱问答项目、基于远监督的中文关系抽取、语音情感分析、中文ULMFiT-情感分析-文本分类-语料及模型、一个拍照做题程序、世界各国大规模人名库、一个利用有趣中文语料库 qingyun 训练出来的中文聊天机器人、中文聊天机器人seqGAN、省市区镇行政区划数据带拼音标注、教育行业新闻语料库包含自动文摘功能、开放了对话机器人-知识图谱-语义理解-自然语言处理工具及数据、中文知识图谱:基于百度百科中文页面-抽取三元组信息-构建中文知识图谱、masr: 中文语音识别-提供预训练模型-高识别率、Python音频数据增广库、中文全词覆盖BERT及两份阅读理解数据、ConvLab:开源多域端到端对话系统平台、中文自然语言处理数据集、基于最新版本rasa搭建的对话系统、基于Tens

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧