如何删除重复的条款

时间:2011-01-11 13:26:33

标签: algorithm r

我的问题如下:

如果我的字符串的术语按其重要性排序(以逗号分隔):

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语言暗示这样的想法。

有人可以帮我一个忙吗?

最佳

2 个答案:

答案 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)