【发布时间】:2015-08-29 06:03:02
【问题描述】:
我想查看我的数据集中的单词是否出现在某个文本中。使用 grepl 时,您只能得到完全匹配。使用agrepl 可以进行部分匹配。但是,我没有得到想要的结果。
示例数据:
dt <- structure(list(id = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L),
words = c("weg", "verte", "spiegelend", "spiegeld", "einde", "spiegel", "spiegelende", "weg", "spiegelend", "asfalt", "fata", "morgana")),
.Names = c("id", "words"), row.names = c(NA, -12L), class = c("data.table", "data.frame"))
与:
dt <- dt[, .(id, words,
match1=mapply(grepl, words,
"hoe komt het dat de weg in de verte soms spiegelend lijkt"),
match2=mapply(agrepl, words,
"hoe komt het dat de weg in de verte soms spiegelend lijkt",
MoreArgs=list(max.distance=1L)))]
我明白了:
> dt
id words match1 match2
1: 0 weg TRUE TRUE
2: 0 verte TRUE TRUE
3: 0 spiegelend TRUE TRUE
4: 0 spiegeld FALSE TRUE
5: 0 einde FALSE FALSE
6: 0 spiegel TRUE TRUE
7: 0 spiegelende FALSE TRUE
8: 1 weg TRUE TRUE
9: 1 spiegelend TRUE TRUE
10: 1 asfalt FALSE FALSE
11: 1 fata FALSE FALSE
12: 1 morgana FALSE FALSE
如您所见,grepl 和 agrepl 的结果在第 4 行和第 7 行上有所不同。但是,我只希望在最多有一个字母差异时进行匹配。因此,第 4 行中 match2 的匹配项应该是 FALSE。更改 max.distance 或 costs 之类的参数也不会产生预期的结果。此外,第 6 行的两个匹配项也应该是 FALSE。
例如:对于文本中的单词“spiegelend”,单词“spieglende”应该给出匹配(只有一个字母不同),但是单词“ spiegel”(两个字母不同)和单词“spiegel”(三个字母不同)应该不匹配。
条件允许(但不能同时):
- 多一个字母(例如:“spieglende”应该匹配),或者
- 少一个字母(例如:“spiegelen”应该匹配),或者
- 一个拼写错误(例如:“spiehelend”应该匹配)
关于如何解决这个问题的任何想法?
【问题讨论】:
-
@Jonny5 实际上,
agrepl正在使用 Levenshtein 距离。但是,使用?agrepl中指定的参数却无法得到想要的结果。 -
@nongkrong 当我想将向量中的单词与特定文本(如示例中指定)进行匹配时,我该怎么做?
-
@nongkrong 只考虑额外的字母,当来自
words的单词短一个字母时,我找不到匹配项(另请参阅问题中的指定条件)
标签: regex r string data.table