關於 字符串 比較相似度問題 |
答題得分者是:christie
|
MatthewSong
一般會員 ![]() ![]() 發表:17 回覆:17 積分:6 註冊:2007-09-24 發送簡訊給我 |
||||
careychen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
那您自己有沒有什麼想法? 或是哪個地方想不到的可以列出來讓站上的前輩們可以了解一下
===================引 用 MatthewSong 文 章=================== 各位大大, 小人想問一個關於 字符串的問題 其實是想比較兩字符串 相似度 , 但唔係比較大小 但想不到方法
------
價值的展現,來自於你用哪一個角度來看待它!! |
|||
st33chen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
||||
christie
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:30 回覆:299 積分:475 註冊:2005-03-25 發送簡訊給我 |
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 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
其實他這做法和你的原理是一樣的 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, 變為二進制或一定的數值,然後比較兩個的數值 如 越大就越似或越小就越似等
------
額有朝天骨,眼中有靈光 |
|||
christie
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:30 回覆:299 積分:475 註冊:2005-03-25 發送簡訊給我 |
如果您的資料庫是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 發送簡訊給我 |
也有比較複雜的 運算法 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 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
生物資訊學有一堆的 alignment 的方法。都可以拿來計分。
可以去參考看看 ===================引 用 MatthewSong 文 章=================== 其實我又不是想很誇想的比較, 只係可能普通的 變成兩個數, 相減的值左右 |
|||
roviury
一般會員 ![]() ![]() 發表:3 回覆:49 積分:15 註冊:2008-08-28 發送簡訊給我 |
變數值很簡單
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來避免 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |