我的问题如下:
如果我的字符串的术语按其重要性排序(以逗号分隔):
text =“光,器件,发光,发光,光学,发光,二极管,电极,光电耦合器,半导体,器件发光,器件光电耦合器,树脂,密封,器件光,半导体器件,发光器件,器件电极,紧凑型发光,紧凑型发光装置,紧凑型发光装置密封装置,装置发光二极管,装置光电耦合器装置,装置密封,发光型,发光型灯,发光型发光,光输出,发光装置密封,光发射器,封装组件,光电耦合器装置,光敏,半导体器件电极,半导体器件光电耦合器,透射,发射器,类型光,类型发光,类型发光二极管“
变量文字中的字词可以按函数 strsplit
或函数 str_split
对字符串字符串进行拆分
library(stringr)
str_split = strsplit(text[1], ", ")
正如我们所看到的,对象str_split
由40个独立的术语组成。
现在,我想提取前10个非重复的术语。
让口袋 = {光,器件,发光,发光,光学,发光,二极管,电极,光电耦合器,半导体}
在第一次迭代中:光,器件,发光,发光,光学,发光,二极管,电极,光电耦合器,半导体。
术语“光”是“发光”的子集,因此我们删除术语“光”并补充变量文本中的第11项,即设备发光。
更新:口袋 = {设备,发光,发光,光学,发光,二极管,电极,光电耦合器,半导体,器件发光}
在第二次迭代中:器件,发光,发光,光学,发光,二极管,电极,光电耦合器,半导体,器件发光
术语“设备”是“设备发光”的子集,因此我们删除术语“设备”并补充变量文本中的第12个术语,即设备光电耦合器。
更新:口袋 = {发光,发光,光学,发光,二极管,电极,光电耦合器,半导体,器件发光,器件光电耦合器}
在第3次迭代中:发光,发光,光学,发光,二极管,电极,光电耦合器,半导体,器件发光,器件光电耦合器
术语“发光”是“发光”的子集,因此我们删除术语“发光”并补充变量文本中的第13项,即树脂。
更新:口袋 = {发光,光学,发光,二极管,电极,光电耦合器,半导体,器件发光,器件光电耦合器,树脂}
在第4次迭代中:发光,光学,发光,二极管,电极,光电耦合器,半导体,器件发光,器件光电耦合器,树脂
术语“发光”是“器件发光”的子集,因此我们删除术语“发光”并在可变文本中补充第14项,即密封。
更新:口袋 = {光学,发光,二极管,电极,光电耦合器,半导体,器件发光,器件光电耦合器,树脂,密封}
第5次迭代:光学,发光,二极管,电极,光电耦合器,半导体,器件发光,器件光电耦合器,树脂,密封
术语“光电耦合器”是“设备光电耦合器”的子集,因此我们删除术语“光电耦合器”并在变量文本中补充第15项,即设备光。
更新:口袋 = {光学,发光,二极管,电极,半导体,器件发光,器件光电耦合器,树脂,密封,器件灯}
在第6次迭代中:光学,发光,二极管,电极,半导体,器件发光,器件光电耦合器,树脂,密封,器件光
术语“设备指示灯”是“设备发光”的子集,因此我们删除术语“设备指示灯”并补充变量文本中的第16个术语,即半导体设备。
更新:口袋 = {光学,发光,二极管,电极,半导体,器件发光,器件光电耦合器,树脂,密封,半导体器件}
其余部分可以通过类比推断。
我很难用R语言暗示这样的想法。
有人可以帮我一个忙吗?
最佳
答案 0 :(得分:3)
您可以使用基于grepl的组合来完成此操作。只需获得所有非重复的条款,并采取前十,这很容易。这个小函数还控制单词内的匹配:在这种情况下,“light”与“lightemitting”不匹配。因此,开始时粘贴功能(为每个术语添加一个空格)。
Remove <- function(x){
tmp <- paste(x,"")
id <- colSums(sapply(tmp,grepl,tmp))==1
x[id]
}
Txt <- "light, device, emitting, light emitting, optical, lightemitting, diode,
electrode, photocoupler, semiconductor, device light emitting,
device photocoupler, resin, sealing, device light, semiconductor device,
lightemitting device, device electrode, compact lightemitting"
Txt_split <- unlist(strsplit(Txt[1], ", "))
> Remove(Txt_split)
[1] "optical" "diode" "device light emitting"
"device photocoupler"
[5] "resin" "sealing" "semiconductor device"
"lightemitting device"
[9] "device electrode" "compact lightemitting"
编辑:这个不遵循您概述的算法,因为在非常大的数据集上需要花费很长时间,并且因为它增长了一个向量(由于存在内存问题的风险,应该在R中避免使用)。
答案 1 :(得分:2)
基本思路:循环遍历列表中的值,检查当前值是否不是先前匹配的sibset。如果是这样,请添加到匹配列表中。
text <- "light, device, emitting, light emitting, optical, lightemitting, diode, electrode, photocoupler, semiconductor, device light emitting, device photocoupler, resin, sealing, device light, semiconductor device, lightemitting device, device electrode, compact lightemitting"
vars <- str_split(text, ", ")[[1]]
matches <- "__something_not_in_your_list_"
for(i in seq_along(vars))
{
if(!any(str_detect(vars[i], matches))) matches <- c(matches, vars[i])
}
matches[-1]
在匹配列表中有一个初始值是一个小问题,因为str_detect
在第二个变量长度为零时不喜欢它。
进一步的想法:如果你不关心词组,那么最简单的方法就是挑选你列表中的所有独特词。
vars <- str_split(text, ", ")[[1]]
all_words <- unlist(str_split(vars, " "))
unique(all_words)