我正在使用R中的两个字符串向量。
第一个元素所有者包含大约100,000个元素,如下所示:
> proprietor
[1] "GERALD RICA LIMITED"
[2] "EUROMASTER STUDIO SRL"
[3] "CENTRE D'ECHANGES INTERNATIONAUX (CEI)"
[4] "RONTEC SERVICE STATION 1A LIMITED"
[5] "MOORGARTH PROPERTIES (LUXEMBOURG) S.A.R.L"
[6] "BEAVRON INVESTMENTS LIMITED"
[7] "MITRALI LIMITED"
另一个 name 包含大约700,000个相似元素:
> name
[1] "MULTIPOINT HOLDINGS LIMITED"
[2] "NYASA PROPERTY LIMITED"
[3] "WHITE LODGE HOLDINGS LIMITED"
[4] "MULTIPOINT HOLDINGS LIMITED"
[5] "MULTIPOINT HOLDINGS LIMITED"
[6] "JBL INVESTMENT LIMITED"
[7] "DIMBLEBY LIMITED"
[8] "LIDL U.K. GMBH"
我想知道所有者的哪些元素也在 name 中,同时考虑到可能会有一些错别字或某些单词,例如“ LIMITED”例如写下“ LTD”。
我已经尝试过的方法:
proprietor %in% name
返回一个空元素,我知道情况并非如此
intersect(proprietor, name)
无法正常工作,因为矢量中存在重复项
主要是,我尝试使用agrep()
进行循环以允许部分匹配:
for (i in 1:97034) {
if (is.null(agrep(proprietor[i], name, max.distance=0.1, value=TRUE, useBytes=TRUE, costs=NULL, ignore.case=TRUE))=="TRUE") {
test[i] <- 1
} else {
test[i] <- agrep(proprietor[i], name, max.distance=0.1, value=TRUE, useBytes=TRUE, costs=NULL, ignore.case=TRUE)
}
}
它返回错误“ regcomp错误:'内存不足'”。我是从R开始的,所以1)我可以看到此循环不是最简单的方法2)我没有得到纠正内存不足错误的方法。
任何有关如何解决此问题的建议将不胜感激!
答案 0 :(得分:0)
我将使用软件包adist
中的函数stringdist
。
最小工作示例:
创建一个无意义单词的向量,并将其称为a:
a <- c("gkhk", "ololsol", "tyuil", "tyuio", "etytyuli")
修饰某些单词(或多或少地具有修饰度),并将其称为向量b:
b <- c("gwrwkhk", "olseotyuioplsol", "thsyuil", "tasyuio", "etytyuli")
然后计算元素之间的距离
yourdistance <- adist(x = a, y = b, ignore.case = TRUE)
yourdistance
将是一个计算元素之间距离的矩阵。
[,1] [,2] [,3] [,4] [,5]
[1,] 3 15 7 7 8
[2,] 7 8 6 7 7
[3,] 7 10 2 3 5
[4,] 7 10 3 2 5
[5,] 8 11 5 5 0
例如,[5,]中的“ etytyuli”和b [,5]中的“ etytyuli”之间的距离将为0,因为我没有将该字符串从a修改为b。
一旦有了此矩阵,您就可以确定对您来说“足够接近”的元素,然后仅选择那些元素。您还可以使用参数cost进行操作,该参数允许您为插入,删除或替换提供不同的成本。
您可能想了解更多有关此的信息:
https://www.r-bloggers.com/fuzzy-string-matching-a-survival-skill-to-tackle-unstructured-information/
希望有帮助。