我有一些带有已定义标签的文字,需要根据标签拆分文字。 例如,给定标签设置为{A,B,C ..}
的文本text <- c("A: how are you B: hello sir C: bye bye")
text2 <- c("USER COMMENTS: TEST PROC: Refer manual. SOLUTION: fix BIAS32 user:param", "TEST PROC: install spare unit. USER COMMENTS: hello sir SOLUTION: tighten bolt 12","TEST PROC: bye bye.")
我需要提取文字&#34;你好吗&#34;,&#34;你好先生&#34;等等。对应于标签A,B等。 没有特定的标签顺序,某些标签可能会丢失,标签可能是短语(不仅仅是字符)
这是我到目前为止提取的与标签A相对应的文字:
gsub("(.*A.*:)(.*)(B.*|C.*)","\\2",text,perl=TRUE)
但这在很多情况下都不起作用! 我正在寻找一个解决方案,我可以定义标签的矢量,如
labels <- c("USER COMMENTS", "TEST PROC", "SOLUTION") # this is a big list!
并提取与这些标签对应的文字,如下所示
用户评论&#34;&#34;,&#34;你好先生&#34; TEST PROC是&#34;参考手册。&#34;,&#34;安装备用设备。&#34;,&#34;再见。&#34; 解决方案是&#34;修复BIAS32用户:param&#34;,&#34;拧紧螺栓12&#34; 等。
答案 0 :(得分:0)
我想我可能有一个基于Sharath评论的解决方案。
首先,有strsplit(),可以根据正则表达式分割矢量。在您的情况下,您可以使用:
labels2<-paste(labels,collapse="|")
[1] "USER COMMENTS|TEST PROC|SOLUTION"
如果你对它应用strsplit:
splittedtext<-strsplit(text2,labels2)
[[1]]
[1] "" ": "
[3] ": Refer manual. " ": fix BIAS32 user:param"
[[2]]
[1] "" ": install spare unit. " ": hello sir "
[4] ": tighten bolt 12"
[[3]]
[1] "" ": bye bye."
你想要什么,对吗?您可以通过添加&#34;:&#34;来进行一些改进。到每个索引的末尾,第一个元素都是乱码。所以照顾后者:
splittedtext<-lapply(splittedtext,"[",-1)
这就产生了一个问题,你必须弄清楚评论所适用的标签。为此,您可以在R。
中使用regexpr()函数pos=sapply(labels,regexpr,text2)
USER COMMENTS TEST PROC SOLUTION
[1,] 1 16 41
[2,] 32 1 57
[3,] -1 1 -1
每个单元格表示所述标签[column]出现在字符串[row]上的位置。 -1表示它不会出现在此字符串中。
现在切换,-1表示NA,并对剩余数字进行排名。这将为您提供哪个字符串片段代表该标签。
pos=ifelse(pos==-1,NA,pos) #switch -1 for NA
pos=t(apply(pos,1,rank,na.last="keep"))
USER COMMENTS TEST PROC SOLUTION
[1,] 1 2 3
[2,] 2 1 3
[3,] NA 1 NA
现在它只是匹配。