我想根据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