Как убрать повторяющиеся сроки - PullRequest
3 голосов
/ 11 января 2011

Моя проблема, как показано ниже:

Если у меня есть строка с терминами, отсортированными по значимости (разделенных запятой ):

text = "свет, прибор, излучающий, светоизлучающий, оптический, светоизлучающий, диодный, электродный, фотопара, полупроводник, светоизлучающий прибор, фотопара устройства, смола, уплотнение, световой прибор, полупроводниковый прибор, светоизлучающий прибор, электрод устройства, компактный светоизлучающий светильник, компактное светоизлучающее устройство, герметизация компактного светоизлучающего устройства, светоизлучающий диод устройства, устройство фотопары устройства, уплотнение устройства, тип излучающего света, свет излучающего типа, излучающий свет типа светоизлучающего, светоотдача, уплотнение устройства светового излучателя, оптический передатчик, сборка упаковки, устройство фотопары , светочувствительный, электрод полупроводникового прибора, фотопреобразователь полупроводникового прибора, пропускающий излучатель, передатчик, тип света, тип света, тип светодиода "

Термины в переменной text могут быть разделены по функции strsplit или по функции str_split пакета stringr.

library(stringr)
str_split = strsplit(text[1], ", ")

Как мы видим, объект str_split состоит из 40 отдельных терминов.

Теперь я хотел бы извлечь первые 10 неповторяющихся терминов.

Let pocket = {свет, прибор, излучающий, светоизлучающий, оптический, светоизлучающий, диодный, электродный, фотопара, полупроводник}

В 1-й итерации: свет , прибор, излучающий, свет, излучающий , оптический, светоизлучающий, диодный, электродный, фотопара, полупроводник.

Термин «свет» - это подмножество «светоизлучающего», поэтому мы удаляем термин «свет» и добавляем 11-е слагаемые в переменную текст , то есть светоизлучающее устройство.

Обновление: карман = {устройство, излучающее, излучающее свет, оптическое, излучающее свет, диод, электрод, фотопара, полупроводник, устройство, излучающее свет}

Во 2-й итерации: прибор , излучающий, светоизлучающий, оптический, светоизлучающий, диодный, электродный, фотопара, полупроводник, прибор светоизлучающий

Термин «устройство» является подмножеством «устройства, излучающего свет», поэтому мы удаляем термин «устройство» и добавляем 12-е слагаемые в переменную текст , то есть фотопара устройства.

Обновление: карман = {испускающий, светоизлучающий, оптический, светоизлучающий, диодный, электродный, фотопара, полупроводник, светоизлучающий прибор, фотопреобразователь устройства}

В 3-й итерации: испускающий , светоизлучающий , оптический, светоизлучающий, диодный, электродный, фотопара, полупроводник, прибор светоизлучающий, прибор фотопары

Термин «излучающий» является подмножеством «излучающего свет», поэтому мы удаляем термин «излучающий» и добавляем 13-е термины в переменную текст , т.е. смолу.

Обновление: карман = {светоизлучающий, оптический, светоизлучающий, диодный, электродный, фотопара, полупроводник, прибор светоизлучающий, фотопара устройства, смола}

В 4-й итерации: светоизлучающий , оптический, светоизлучающий, диодный, электродный, фотопара, полупроводниковый, прибор светоизлучающий , фотопара устройства, смола

Термин «светоизлучающий» является подмножеством «светоизлучающего устройства», поэтому мы удаляем термин «светоизлучающий» и добавляем 14-е слагаемые в переменную текст , т.е.

Обновление: карман = {оптический, светоизлучающий, диодный, электродный, фотопара, полупроводник, прибор светоизлучающий, прибор фотопара, смола, уплотнение}

В 5-й итерации: оптический, светодиодный, электродный, фотопара , полупроводниковый, светоизлучающий прибор, фотопара, прибор , смола, герметизирующая

Термин "фотопара" является подмножеством "фотопара устройства", поэтому мы удаляем термин "фотопара" и добавляем 15-е термины в переменную текст , то есть свет устройства.

Обновление: карман = {оптический, светоизлучающий, диодный, электродный, полупроводниковый, прибор светоизлучающий, фотопара устройства, смола, уплотнение, прибор световой}}

В 6-й итерации: оптический, светоизлучающий, диодный, электродный, полупроводниковый, прибор светоизлучающий , фотопара устройства, смола, уплотнение, прибор световой

Термин «свет устройства» является подмножеством «свет устройства», поэтому мы удаляем термин «свет устройства» и добавляем 16-е термины в переменную текст , т.е. полупроводниковое устройство.

Обновление: карман = {оптический, светоизлучающий, диодный, электродный, полупроводниковый, прибор светоизлучающий, фотопара устройства, смола, герметик, полупроводниковый прибор}

Остальное можно вывести по аналогии.

Мне трудно подразумевать такую ​​идею под языком R.

Может ли кто-нибудь сделать мне одолжение?

Лучший

Ответы [ 2 ]

3 голосов
/ 11 января 2011

Вы можете сделать это с помощью комбинации, основанной на 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 из-за риска проблем с памятью)

2 голосов
/ 11 января 2011

Основная идея: перебирать значения в списке, проверяя, не является ли текущее значение набором предыдущих совпадений. Если это так, добавьте в список совпадений.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...