我想根據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. 基於字符串比較的數組交集基於字符串比較
- 6. 比較字符串的相似之處?
- 7. C#比較相似的字符串
- 8. 比較字符串數組的相似性
- 9. 紅寶石比較兩個字符串的相似百分比
- 10. R - 比較類似但不相同的字符串
- 11. 陣列的編輯距離百分比
- 12. 字符串比較,返回最相似
- 13. C# - 比較字符串相似
- 14. Macro VBA - 比較兩個字符串中的相似數字
- 15. 比較長字符串並返回相似度和百分比
- 16. 字符串比較算法,相關性,多少「相似」2個字符串
- 17. 字符串與最相似字符串的比較
- 18. 基於字符串比較的過濾
- 19. Python比較兩個字符串的相似性列表
- 20. 比較兩個英文字符串的相似性
- 21. 比較兩個字符串的相似性在Python
- 22. 比較兩個向量字符串的相似性C++
- 23. Redshift:任何計算模糊字符串相似度/字符串編輯距離的方法?
- 24. 如何比較字符串數組並計算相似的字
- 25. 如何根據SQL中的字符相似性比較字符串?
- 26. C#字符串「相似性」比較測試
- 27. C#字符串比較相當於假
- 28. 如何比較2個具有相似字符的字符串?
- 29. MongoDB:相當於ObjectID比較的字符串ID的$ lt比較?
- 30. 比較字符串基名
您是否探索過'adist'和'agrep'?我不熟悉SPEDIS。 – A5C1D2H2I1M1N2O1R2T1 2012-07-18 06:51:19