在R中的变量中查找类似的单词

时间:2016-01-16 12:39:07

标签: regex r character

我们说我有一个包含以下单词的变量

ChicKen120
Chicken1.20
Chicken(1.20)
Cow
cow.
cow/
cat
  1. 如何找到仅有一两个字符的相似单词?
  2. 我意识到我能做到 grep("chicken", df$words, ignore.case=T)找到与鸡肉相似的所有单词,但是通过每个单词来处理这个单词会很乏味,即第一只鸡,然后是牛,然后是猫......

    有没有办法在整栏中找到相似的单词?

    1. 我想将类似的单词转换为一种标准格式,

      chicken(1.20)
      chicken(1.20)
      chicken(1.20)
      cow
      cow
      cow
      cat
      

2 个答案:

答案 0 :(得分:5)

关于您的第一个问题,您可以尝试使用adist()

text <- c("ChicKen120","Chicken1.20","Chicken(1.20)","Cow","cow.", "cow/")
> adist(text)
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    0    2    4    9    9    9
#[2,]    2    0    2   10    9   10
#[3,]    4    2    0   12   11   12
#[4,]    9   10   12    0    2    2
#[5,]    9    9   11    2    0    1
#[6,]    9   10   12    2    1    0

具有2个或更少连接对的六个字的矩阵元素,最多相差2个字符。

更具体地说,可以列出不相同且最多相差两个字符的单词对:

which(adist(text)<=2 & upper.tri(adist(text)), arr.ind=T)     
#     row col
#[1,]   1   2
#[2,]   2   3
#[3,]   4   5
#[4,]   4   6
#[5,]   5   6

这里逻辑函数upper.tri()已被用于仅选择矩阵的上三角形,从而防止对的双输出(即,以相反的顺序重复)并去除对角线上的相同对。

可以像这样检索与上面列出的行号和列号对应的单词:

words <- text[which(adist(text)<=2 & upper.tri(adist(text)), arr.ind=T)]
matrix(words,ncol=2)
#     [,1]          [,2]           
#[1,] "ChicKen120"  "Chicken1.20"  
#[2,] "Chicken1.20" "Chicken(1.20)"
#[3,] "Cow"         "cow."         
#[4,] "Cow"         "cow/"         
#[5,] "cow."        "cow/"  

答案 1 :(得分:1)

考虑一个嵌套的gsub,删除所有不需要的特殊字符,并保留单词stem甚至全部移动到小写。下面删除了正斜杠和反斜杠,句点和括号(如果需要将其他模式合并到模式参数中并使用管道分隔符分隔):

df$newvar <- gsub(pattern = '([[:upper:]])', perl = TRUE, 
                  replacement = '\\L\\1', gsub('[/|\\\\|\\.()]','', df$var))

由此,使用另一个gsub()来处理其他所需的模式,用户必须根据这些模式决定您的需求和数据。 R很难从(1.20)1201.20知道你想要df$newvar <- gsub('120','(1.20)', df$newvar)

    var             newvar
1   ChicKen120      chicken(1.20)
2   Chicken1.20     chicken(1.20)
3   Chicken(1.20)   chicken(1.20)
4   Cow             cow
5   cow.            cow
6   cow/            cow
7   cat             cat
8   cat\            cat                 #<---- ADDED FOR DEMO

<强>观察

{{1}}