全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3142
推到 Plurk!
推到 Facebook!

關於 字符串 比較相似度問題

答題得分者是:christie
MatthewSong
一般會員


發表:17
回覆:17
積分:6
註冊:2007-09-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-18 12:58:54 IP:202.175.xxx.xxx 訂閱
各位大大, 小人想問一個關於 字符串的問題

其實是想比較兩字符串 相似度 , 但唔係比較大小

但想不到方法

careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-18 23:31:48 IP:59.126.xxx.xxx 訂閱
那您自己有沒有什麼想法? 或是哪個地方想不到的可以列出來讓站上的前輩們可以了解一下

===================引 用 MatthewSong 文 章===================
各位大大, 小人想問一個關於 字符串的問題

其實是想比較兩字符串 相似度 , 但唔係比較大小

但想不到方法

------
價值的展現,來自於你用哪一個角度來看待它!!
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-19 08:20:31 IP:122.116.xxx.xxx 未訂閱
您好,

記得(沒用過) delphi 有個 soundex

google 一下 delphi soundex 應該有些資料可參考吧.

------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
christie
資深會員


發表:28
回覆:299
積分:475
註冊:2005-03-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-19 08:38:17 IP:59.125.xxx.xxx 訂閱
RE: finding similarities in strings
Ref:
http://www.delphipages.com/threads/thread.cfm?ID=23552&G=23542

function SoundEx(aText : string) : string;
var
tempString1,
tempString2 : string;
counter : integer;
begin
tempString1 := '';
tempString2 := '';
aText := Uppercase(aText);

for counter := 1 to Length(aText) do
begin
case aText[counter] of
'B', 'F', 'P', 'V' : Appendstr(tempString1, '1');
'C', 'G', 'J', 'K', 'Q', 'S', 'X', 'Z' : Appendstr(tempString1, '2');
'D', 'T' : Appendstr(tempString1, '3');
'L' : Appendstr(tempString1, '4');
'M', 'N' : Appendstr(tempString1, '5');
'R' : Appendstr(tempString1, '6');
end;
end;

// Remove double sequenttail occurrences
for counter := 1 to length(tempString1) do
begin
if (tempString1[counter - 1] <> tempString1[counter]) then
Appendstr(tempString2, tempString1[counter]);
end;
Result:=tempString2
end; // SoundEx

function SoundAlike(aText1, aText2 : string) : boolean;
begin
result := SoundEx(aText1) = SoundEx(aText2);
end; // SoundAlike

procedure TForm1.Button1Click(Sender: TObject);
begin
IF SoundAlike(Edit1.Text, Edit2.Text) THEN
ShowMessage('THESE TWO STRINGS ARE ALIKE')
ELSE
ShowMessage('THESE TWO STRINGS ARE NOT ALIKE')
end;


===================引 用 st33chen 文 章===================
您好,

記得(沒用過) delphi 有個 soundex

google 一下 delphi soundex 應該有些資料可參考吧.

------
What do we live for if not to make life less difficult for each other?
編輯記錄
christie 重新編輯於 2009-03-19 09:42:41, 註解 無‧
MatthewSong
一般會員


發表:17
回覆:17
積分:6
註冊:2007-09-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-03-19 09:06:05 IP:202.175.xxx.xxx 訂閱
大大, 這個不像我想要的相似度

其實我的想法是 把兩個string, 變為二進制或一定的數值,然後比較兩個的數值 如 越大就越似或越小就越似等
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-03-19 14:48:14 IP:59.112.xxx.xxx 訂閱
其實他這做法和你的原理是一樣的 http://linux.tnc.edu.tw/techdoc/banic/string/soundex.html
http://en.wikipedia.org/wiki/Soundex


你想自己編一個表,會不會最後編的跟Soundex 一樣呢? (參考wiki的文章裡有編碼)

字串比對這個題目很有趣....Soundex 這方法是英語系想出來的, 如果是中文要怎麼比? 用形狀還是用發音?
我猜如果要做中文的...可能要從輸入法的mapping table去偷師...

我看市場上手寫版辨識的方法,好像是用 直橫撇那勾 等單筆劃 順序做成mapping table ,我是猜的,我沒實做過不知道


===================引 用 MatthewSong 文 章===================
大大, 這個不像我想要的相似度

其實我的想法是 把兩個string, 變為二進制或一定的數值,然後比較兩個的數值 如 越大就越似或越小就越似等
------
額有朝天骨,眼中有靈光
編輯記錄
小傑克 重新編輯於 2009-03-19 15:04:02, 註解 無‧
小傑克 重新編輯於 2009-03-19 15:13:12, 註解 無‧
christie
資深會員


發表:28
回覆:299
積分:475
註冊:2005-03-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-03-19 15:17:14 IP:59.125.xxx.xxx 訂閱
如果您的資料庫是ORACLE版本10g可以用utl_match.edit_distance_similarity

select 'FINTASTIC' SEEKING
,REPLACE(T_NA,'"','') POSSIBLE_MATCH
,utl_match.edit_distance_similarity('FINTASTIC',REPLACE(T_NA,'"','')) DIS_SIMILARITY
FROM TABxx;

請看說明:
There is a similar function utl_match.edit_distance_similarity(string1, string2)
which returns an integer between 0 (no similarity) and 100 (perfect match).
===================引 用 MatthewSong 文 章===================
大大, 這個不像我想要的相似度

其實我的想法是 把兩個string, 變為二進制或一定的數值,然後比較兩個的數值 如 越大就越似或越小就越似等
------
What do we live for if not to make life less difficult for each other?
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-03-19 20:31:28 IP:122.116.xxx.xxx 未訂閱
也有比較複雜的 運算法 oh

http://www.dcs.shef.ac.uk/~sam/stringmetrics.html#soundex

裡面還有一大堆連結

我想, 如果要當真, 這可以是一題論文的題目吧
尤其是 中文字串的相似度


------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
MatthewSong
一般會員


發表:17
回覆:17
積分:6
註冊:2007-09-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-03-19 22:09:41 IP:122.100.xxx.xxx 訂閱
其實我又不是想很誇想的比較, 只係可能普通的 變成兩個數, 相減的值左右
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-03-20 08:38:03 IP:60.249.xxx.xxx 未訂閱
生物資訊學有一堆的 alignment 的方法。都可以拿來計分。
可以去參考看看
===================引 用 MatthewSong 文 章===================
其實我又不是想很誇想的比較, 只係可能普通的 變成兩個數, 相減的值左右
roviury
一般會員


發表:3
回覆:49
積分:15
註冊:2008-08-28

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-05-11 18:18:01 IP:203.186.xxx.xxx 訂閱
變數值很簡單
function valstr(s:string):cardinal;
var
i:integer;
begin
result:=0;
for i:=0 to length(s)-1 do inc(result,ord(s[i 1]));
end;
我相信你是要這個比較相似性了

showmessage(inttostr(valstr('abcdefg')-valstr('abcdefe')));

愈近0就愈相似
=0就是相等

會產生負數,可用abs來避免
編輯記錄
roviury 重新編輯於 2009-05-11 18:32:05, 註解 無‧
roviury 重新編輯於 2009-05-11 18:34:10, 註解 無‧
系統時間:2017-12-15 19:54:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!