检查R中是否有2行文本几乎相等

时间:2014-02-04 13:54:04

标签: string r matching text-processing

我有以下数据,我想检查是否有2条记录具有相同的地址。

Id  Class   Address
42  18  PLOT#39 H#8-2-293/A4/A/
42  68  PLOT #39 H #8-2-293/A4/A
42  35  PLOT NO 1030 BUNGLOW NO
42  34  PLOT NO 1030 BUNGLOW NO
42  00  PLOT 1030 BUNGLOW NO 3
42  53  PLOT NO-39 H#8-2-293/A4/
42  70  GAYATRAI RESIDENCY MADHU

我使用 strsplit(dt $ Address,“”)对地址进行标记,并将其存储在列表变量中。如果70%的单词匹配,我会将其视为相同的地址。

我的问题是当我使用strplit()时,它给了我一个

> strsplit(dt$Address, " ")[1]
[[1]]
[1] "PLOT#39"  "H#8-2-293/A4/A/"

所以在这里我无法迭代这些单词来检查这些单词是否存在于另一个地址列表中。如何检查它们是否几乎相等。

2 个答案:

答案 0 :(得分:0)

您可以根据空间而不是标记它。尝试添加#和/或/以获得“更好”的单词列表。

> strsplit("PLOT#39 H#8-2-293/A4/A/", " |#")[1]
[[1]]
[1] "PLOT"          "39"            "H"             "8-2-293/A4/A/"

> strsplit("PLOT#39 H#8-2-293/A4/A/", " |#|/")[1]
[[1]]
[1] "PLOT"    "39"      "H"       "8-2-293" "A4"      "A"   

你如何从这里继续是一个艰难的过程 - 你可以检查有多少部分与其他部分匹配或其他一些算法。

答案 1 :(得分:0)

您可以查看实现大量不同字符串距离度量的stringdist包。例如,

data <- "Id,Class,Address
42,18,PLOT#39 H#8-2-293/A4/A/
42,68,PLOT #39 H #8-2-293/A4/A
42,35,PLOT NO 1030 BUNGLOW NO
42,34,PLOT NO 1030 BUNGLOW NO
42,00,PLOT 1030 BUNGLOW NO 3
42,53,PLOT NO-39 H#8-2-293/A4/
42,70,GAYATRAI RESIDENCY MADHU"
data <- read.csv(textConnection(data), header=TRUE, stringsAsFactors=TRUE)

# Create a data.frame with all combinations of addresses
d2 <- expand.grid(data$Address, data$Address)
# remove duplicate addresses
d2 <- d2[d2[[1]] != d2[[2]], ]

# calculate distance
library(stringdist)
d2$d <- stringdist(d2[[1]], d2[[2]], method="jw")

有大量的字符串距离度量。我使用了Jaro-Winkler距离(通常用于比较名称),但您必须尝试查看哪一种最适合您。然后,您可以选择最相似的地址:

> # show records with a distance smaller than 0.15
> d2[d2$d < 0.15, ]
                       Var1                     Var2          d
2  PLOT #39 H #8-2-293/A4/A  PLOT#39 H#8-2-293/A4/A/ 0.05742205
8   PLOT#39 H#8-2-293/A4/A/ PLOT #39 H #8-2-293/A4/A 0.05742205
19   PLOT 1030 BUNGLOW NO 3  PLOT NO 1030 BUNGLOW NO 0.13937512
26   PLOT 1030 BUNGLOW NO 3  PLOT NO 1030 BUNGLOW NO 0.13937512
31  PLOT NO 1030 BUNGLOW NO   PLOT 1030 BUNGLOW NO 3 0.13937512
32  PLOT NO 1030 BUNGLOW NO   PLOT 1030 BUNGLOW NO 3 0.13937512

但是,根据地址的不同,您可能需要先对地址进行标准化。我不知道这样做的R包。我知道Febrl应该有一些用于地址标准化的工具,但我从未使用它们,因此无法评论它们的可用性。