PL/SQL是否可以判断两个字符串相似?

牧牛人软件 2005-11-29 10:18:37
例如:
1。“中国工商银行杭州市分行”与“工商银行杭州市分行庆春支行”
2。“浙江省开元房地产开发有限公司”与“开元房地产开发公司”
属于“相似”。
...全文
843 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
wffffc 2006-02-19
  • 打赏
  • 举报
回复
用oracle的通配符%和_
1。“中国工商银行杭州市分行”与“工商银行杭州市分行庆春支行”
这里你可以查"%工商银行杭州市分行%"
2。“浙江省开元房地产开发有限公司”与“开元房地产开发公司”
这里你可以查"%开元房地产%"
牧牛人软件 2006-02-17
  • 打赏
  • 举报
回复
谢谢!有好算法请继续.
xjqqxjqq 2005-12-16
  • 打赏
  • 举报
回复
呵呵,这个算法较复杂了,实现起来有难度阿
richu 2005-12-16
  • 打赏
  • 举报
回复
很经典的句子,不错。学习了。
软侠 2005-12-16
  • 打赏
  • 举报
回复
支持 boydgmx(梦霄) 的做法。
我以為可以把字符數少的那個字串先拿出來,然後分兩步來對比:
假設有字串A、字串B,其中Length(A)<=Length(B),那麼設置S:=A,
第一步
每次從S的後面去掉一個字符,然後把去掉字符後的字串跟B比較,看是否全部包含在B中,當發現包含時跳出循環,並作個標志,其值為TRUE;
第二步
每次從S的前面去掉一個字符,然後把去掉字符後的字串跟B比較,看是否全部包含在B中,當發現包含時跳出循環,並作另一個標志,其值為TRUE;

如果兩步中的標志值都是TRUE,則可以近似的認為兩個字符串相似,如果認為上述判斷還不夠近似的話,則還可以同時再加其它的判斷,如樓上所給的代碼。
boydgmx 2005-12-16
  • 打赏
  • 举报
回复
目前能想到的就这些了,楼上说的很有道理,如果要求很高的话,我这个函数也不行。但经过测试,你提供的例子肯定是没有问题的
boydgmx 2005-12-16
  • 打赏
  • 举报
回复
create or replace function islike(strA in varchar2,strB in varchar2) return number
is
lenA number(7):=0;
lenB number(7):=0;
stringA varchar2(4000):='';
stringB varchar2(4000):='';
strTemp varchar2(4000):='';
i number(7):=0;
cnt number(7):=0;
begin
if strA is null or strB is null then
return 0;
end if;

--计算长度
lenA :=length(strA);
lenB :=length(strB);

--剔除两个字符串中的重复字符
stringA:=substr(strA,1,1);
for i in 2..lenA loop
if nvl(instr(stringA,substr(strA,i,1)),0)=0 then
stringA:=stringA||substr(strA,i,1);
end if;
end loop;

stringB:=substr(strB,1,1);
for i in 2..lenB loop
if nvl(instr(stringB,substr(strB,i,1)),0)=0 then
stringB:=stringB||substr(strB,i,1);
end if;
end loop;

--换位,确保 stringA 是较长的那个
if length(stringB)>length(stringA) then
strTemp:=stringA;
stringA:=stringB;
stringB:=strTemp;
end if;

--重新计算长度
lenA :=length(stringA);
lenB :=length(stringB);

--认为相同字符个数过半数才可能相似
if lenB<ceil(lenA/2) then
return 0;
end if;

if stringA=stringB or instr(stringA,stringB)>0 then
return 1;
end if;

cnt :=0;
for i in 1..lenB loop
if instr(stringA,substr(stringB,i,1))>0 then
cnt:=cnt+1;
end if;
end loop;

if cnt<ceil(lenA/2) then
return 0;
else
return 1;
end if;
end;
/
zihu928 2005-12-16
  • 打赏
  • 举报
回复
我觉得简单的详细比较容易判断,但是如果是智能地判断,就需要建立知识库,通过词汇的方式判断。这个应该涉及中文的语法和关键词
nicolas1999king 2005-12-16
  • 打赏
  • 举报
回复
是连续相等。。呵呵
nicolas1999king 2005-12-16
  • 打赏
  • 举报
回复
create or replace procedure IsLike(strA in varchar2,strB in varchar2,blnisLike out number)
is
begin
blnislike:=0;

if strA=strB then
blnislike:=1;
return;
end if;

if instr(strA,strB)>0 then
blnislike:=1;
return;
end if;

if instr(strB,strA)>0 then
blnislike:=1;
return;
end if;

if strA中和strB中字符联系相等的个数超过了strA的长度的一半或2/3 并且超过了strB的长度的一半或1/3 then
blnislike:=1;
return;
end if;

end;
/
hlp912 2005-12-16
  • 打赏
  • 举报
回复
有难度,不过可以试试,试出来后肯定有市场。

大家努力........
yuwei201 2005-12-15
  • 打赏
  • 举报
回复
select * from table where ziduan like '%公司%';
查找table表里,ziduan字段包含“公司”字符的记录
zealot_zk 2005-12-15
  • 打赏
  • 举报
回复
这应该可以归结为一个只能搜索的问题,学习中,不过好像很难,我们做了很久也没什么进展
Renkey 2005-12-15
  • 打赏
  • 举报
回复
来学习下,呵呵
issgates 2005-12-15
  • 打赏
  • 举报
回复
这也行,忒强了吧!
wuwen19 2005-12-15
  • 打赏
  • 举报
回复
这个太高难度
牧牛人软件 2005-12-01
  • 打赏
  • 举报
回复
加权值?请解释
wgsasd311 2005-11-30
  • 打赏
  • 举报
回复
楼主的问题属于中文分词功能,只要到www.google.com搜索下“中文分词”就知道了。
pdw2009 2005-11-30
  • 打赏
  • 举报
回复
中文分词,根据加权值来确定其相似度
hevin 2005-11-30
  • 打赏
  • 举报
回复
oracle 有一个发音相似函数soundex,倒没有听说有语义相似函数。
加载更多回复(5)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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