我想根據2個字符串之間的比較來分配相似性分數。在R中是否有相同的函數?我知道SAS中的這種函數的名稱爲SPEDIS。請讓我知道R中是否有這樣的功能。基於R(編輯距離)中字符串比較的相似性分數
回答
函數adist計算兩個字符串之間的Levenshtein edit distance。這可以轉化爲1 - (Levenshtein編輯距離/更長的字符串長度)的相似性度量。
RecordLinkage包中的levenshteinSim
函數也直接執行此操作,並且可能會比adist
更快。
library(RecordLinkage)
> levenshteinSim("apple", "apple")
[1] 1
> levenshteinSim("apple", "aaple")
[1] 0.8
> levenshteinSim("apple", "appled")
[1] 0.8333333
> levenshteinSim("appl", "apple")
[1] 0.8
ETA:有趣的是,levenshteinDist
在RecordLinkage包似乎是略快於adist
,levenshteinSim
比任一慢得多。使用rbenchmark包:
> benchmark(levenshteinDist("applesauce", "aaplesauce"), replications=100000)
test replications elapsed relative
1 levenshteinDist("applesauce", "aaplesauce") 100000 4.012 1
user.self sys.self user.child sys.child
1 3.583 0.452 0 0
> benchmark(adist("applesauce", "aaplesauce"), replications=100000)
test replications elapsed relative user.self
1 adist("applesauce", "aaplesauce") 100000 4.277 1 3.707
sys.self user.child sys.child
1 0.461 0 0
> benchmark(levenshteinSim("applesauce", "aaplesauce"), replications=100000)
test replications elapsed relative
1 levenshteinSim("applesauce", "aaplesauce") 100000 7.206 1
user.self sys.self user.child sys.child
1 6.49 0.743 0 0
這個開銷是由於單純爲levenshteinSim
的代碼,這僅僅是一個圍繞levenshteinDist
包裝:
> levenshteinSim
function (str1, str2)
{
return(1 - (levenshteinDist(str1, str2)/pmax(nchar(str1),
nchar(str2))))
}
FYI:如果你總是比較兩個字符串,而不是矢量,您可以創建使用max
代替pmax
新版本和刮鬍子〜25%的運行時間:
mylevsim = function (str1, str2)
{
return(1 - (levenshteinDist(str1, str2)/max(nchar(str1),
nchar(str2))))
}
> benchmark(mylevsim("applesauce", "aaplesauce"), replications=100000)
test replications elapsed relative user.self
1 mylevsim("applesauce", "aaplesauce") 100000 5.608 1 4.987
sys.self user.child sys.child
1 0.627 0 0
長話短說 - 在性能方面,adist
和levenshteinDist
之間幾乎沒有什麼區別,但如果您不想添加軟件包依賴關係,前者更可取。如何將其轉化爲相似性度量對性能有一定影響。
嗨, 是的,該功能是有幫助的。另外,是否有可能在sql查詢中直接使用這個函數。我正在使用sqldf軟件包寫入一個sql查詢並將其結果分配給R.example中的數據框 title_score <-sqldf(「select a.id as mp_id,b.id as sp_id, case when levenshteinSim(a ((100-levenshteinSim(a.title,b.title))/ 100)* c.weights else 0 end as title_score from allproducts a 加入所有產品b on a。 subcategory_id = b.subcategory_id和a.id> b.id 在b.subcategory_id = c.subcategory和c.filter_name ='title'「)上連接filterweights c; – 2012-07-18 12:20:49
- 1. 字符串相似性 - > Levenshtein距離
- 2. 編輯字符串距編輯距離最短的字符串
- 3. 基於預先計算的哈希比較字符串距離
- 4. Python字符串比較相似性
- 5. C#比較相似的字符串
- 6. 比較字符串數組的相似性
- 7. 紅寶石比較兩個字符串的相似百分比
- 8. R - 比較類似但不相同的字符串
- 9. Macro VBA - 比較兩個字符串中的相似數字
- 10. 字符串比較算法,相關性,多少「相似」2個字符串
- 11. 字符串與最相似字符串的比較
- 12. 比較兩個向量字符串的相似性C++
- 13. Redshift:任何計算模糊字符串相似度/字符串編輯距離的方法?
- 14. 如何根據SQL中的字符相似性比較字符串?
- 15. C#字符串「相似性」比較測試
- 16. C#字符串比較相當於假
- 17. MongoDB:相當於ObjectID比較的字符串ID的$ lt比較?
- 18. 比較字符串基名
- 19. 選擇性編輯距離
- 20. Levenshtein帶分隔符的多字符單位編輯距離
- 21. 按相似性分組字符串
- 22. 如何比較python中兩個相似的句子字符串?
- 23. 比較字符串數組中的一部分字符串
- 24. 編輯距離爲2的字符串的散列技術2
- 25. 關於字符串比較
- 26. 關於字符串比較
- 27. 用於字符串比較
- 28. 字符串拆分比較
- 29. 編輯器類似於比較編輯器
- 30. 加權編輯距離的相似矩陣
您是否探索過'adist'和'agrep'?我不熟悉SPEDIS。 – A5C1D2H2I1M1N2O1R2T1 2012-07-18 06:51:19