我想看看我的數據集中的單詞是否出現在某個文本中。當使用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的不同。但是,我只想在最大一個字母差異時進行比賽。因此match2
第4行的匹配應該是FALSE
。更改參數如max.distance
或costs
也不會導致所需的結果。而且,第6行的兩個匹配也應該是FALSE
。
例如:從文本詞「spiegelend」,字「spiegelende」應該給比賽(只有一個字母之差),但這個詞「spiegeld」(兩個字母的區別)和「spiegel」(三個字母的差異)應該而不是給一個匹配。
條件允許(但不是在同一時間):
- 一個字母以上(例如: 「spiegelende」 應該給匹配),或
- 一個字母以下(例如: 「spiegelen」 應該給出一個匹配),或者
- 一個拼寫錯誤(例如: 「spiehelend」 應該給出一個匹配)
有關如何解決此問題的任何想法?
@ Jonny5其實,'agrepl'使用Levenshtein距離。但是,使用'?agrepl'中指定的參數我無法獲得所需的結果。 – Jaap
@nongkrong當我想將某個矢量中的單詞與特定文本(如示例中指定的)匹配時,我該怎麼做? – Jaap
@nongkrong @nongkrong只考慮了額外的字母,當'words'中的單詞短一個字母時,我沒有得到匹配(另請參見問題中的指定條件) – Jaap