R 使用正则表达式提取特定字符串
我有一个包含字符串和POS标记的数据包。我想通过过滤特定的POS标签来提取特定的字符串 举个简单的例子,我想提取以“NN-NN-NN”和“VB-JJ-NN”为基数的字符串R 使用正则表达式提取特定字符串,r,regex,R,Regex,我有一个包含字符串和POS标记的数据包。我想通过过滤特定的POS标签来提取特定的字符串 举个简单的例子,我想提取以“NN-NN-NN”和“VB-JJ-NN”为基数的字符串 你不需要正则表达式。可以使用stringdist-软件包中的amatch-功能: vec <- c("NN-NN-NN", "VB-JJ-NN") library(stringdist) df[!!amatch(df$pos_tag, vec, maxDist = 1, nomatch = 0),] 它的作用是:
你不需要正则表达式。可以使用
stringdist
-软件包中的amatch
-功能:
vec <- c("NN-NN-NN", "VB-JJ-NN")
library(stringdist)
df[!!amatch(df$pos_tag, vec, maxDist = 1, nomatch = 0),]
它的作用是:
查看amatch(df$pos_标记,vec,maxDist=1,nomatch=0)
中的值是否与df$pos_标记
中的值匹配,并具有指定的差异公差vec
- 在本例中,我使用了1个字符的最大允许编辑距离:
maxDist=1
- 通过双重否定,
创建一个逻辑向量,指示
(几乎)是否与vec中的一个值匹配。另一种选择是:pos\u标记
df[amatch(df$pos_标签,vec,maxDist=1,nomatch=0)>0,]
您也可以在基本R中使用
agrep
/agrepl
并结合sapply
/lappy
和行和
/取消列表
:
# method 1:
df[rowSums(sapply(vec, function(x) agrepl(x, df$pos_tag, max.distance = 1))) > 0,]
# method 2:
df[unlist(lapply(vec, function(x) agrep(x, df$pos_tag, max.distance = 1))),]
两者都会给你相同的结果。在预期的u have
NNS-NN-NN
模式不清晰问题不是很清楚。让我看看我是否理解了:您希望从word中获取“I”元素,并将其与pos_标记中的“I”元素相匹配,将从1到“I”的行写入文件/控制台,其中“I”代表循环索引控件。您还需要打印行号。这就是你想要的吗?哇~这真是一个有效的方法。我已经在我的过程中使用了这种方法。但这表明了另一个问题。因为在我的数据中也有诸如“in-NN-NN”、“VB-RB-in”、“NN-in-NN”等pos标签。(很抱歉,我没有在示例df中显示所有pos标记)。因此,当我使用amatch()时,它还会提取我不想要的其他模式。@Eva这取决于您有多少“假”匹配,但有一种可能性是使用过滤掉假匹配!df$pos_标签%c(“in-NN-NN”、“VB-RB-in”、“NN-in-NN”)
word pos_tag
1 abrasion process management NN-NN-NN
2 slurries comprise abrasive NNS-NN-NN
3 slurry compositions comprise NN-NNS-NN
4 keep high polishing VB-JJ-NN
5 improved superabrasive grit VBN-JJ-NN
6 using ceriacoated silica VBG-JJ-NN
vec <- c("NN-NN-NN", "VB-JJ-NN")
library(stringdist)
df[!!amatch(df$pos_tag, vec, maxDist = 1, nomatch = 0),]
word pos_tag
1 abrasion process management NN-NN-NN
2 slurries comprise abrasive NNS-NN-NN
3 slurry compositions comprise NN-NNS-NN
4 keep high polishing VB-JJ-NN
5 improved superabrasive grit VBN-JJ-NN
6 using ceriacoated silica VBG-JJ-NN
# method 1:
df[rowSums(sapply(vec, function(x) agrepl(x, df$pos_tag, max.distance = 1))) > 0,]
# method 2:
df[unlist(lapply(vec, function(x) agrep(x, df$pos_tag, max.distance = 1))),]