R stringR RegExp стратегия для группировки похожих выражений без предварительного знания - PullRequest
0 голосов
/ 11 мая 2018

У меня есть список из 50K + номеров деталей. Мне нужно сгруппировать их по типу продукта. Номера деталей, как правило, расположены рядом друг с другом в последовательности, хотя они не являются абсолютно последовательными. Описание продукта всегда похоже, но не соответствует оптимальным правилам. Позвольте мне проиллюстрировать это следующей таблицей.

| PartNo | Description | ProductType |
|--------|-------------|-------------|
|A000443 |Water Bottle |    Water    |
|A000445 |Contain Water|    Water    |
|A000448 |WaterBotHold |    Water    |
|HRZ55   |Hershey_Bar  | Energy Bar  |
|RRB55   |Candy Energy | Energy Bar  |
|QMU55   |Bar Protein  | Energy Bar  |

Я не знаю типы продуктов заранее. Регулярное выражение stringR должно быть достаточно умным, чтобы генерировать тип продукта из описания деталей. Я новичок, только пробивающийся через R для Data Science , и это кажется достижимым, хотя и трудным.

Как бы вы справились с этой проблемой? То, с чем я на самом деле работаю, показано ниже. Ожидается, что мой синтаксис stringR заполнит столбец ProductType.

| PartNo | Description | ProductType |
|--------|-------------|-------------|
|A000443 |Water Bottle |             |
|A000445 |Contain Water|             |
|A000448 |WaterBotHold |             |
|HRZ55   |Hershey_Bar  |             |
|RRB55   |Candy Energy |             |
|QMU55   |Bar Protein  |             |

Вот воспроизводимый пример, чтобы заставить мяч катиться.

library(tidyverse)
library(stringr)
df <- tribble(
  ~PartNo, ~Description, ~ProductType, 
  "A000443", "Water Bottle", "",
  "A000445", "Contain Water", "",
  "A000448", "WaterBotHold", "",
  "HRZ55", "Hershey_Bar", "",
  "RRB55", "Candy Energy", "",
  "QMU55", "Bar Protein", ""
)

1 Ответ

0 голосов
/ 11 мая 2018

Вы можете попробовать stringr::str_extract. Это работает для нескольких слов, которые разделены |.

Обновлен:

ОП предположил, что слова для поиска ProductType неизвестны, и их следует выбирать на основе частоты появления различных слов в столбце Description.

Можно использовать пакет qdap, чтобы найти частоты различных слов и выбрать верхние n (скажем, 2) слова, которые будут определять тип продукта. Решение будет таким:

library(stringr)
library(qdap)

#Find frequencies of different words
freq <- freq_terms(df$Description)

#Select top `n`. I have taken top 2 and create regex pattern 
word_to_search <- paste0(freq$WORD[1:2],collapse = "|")

df$ProductType <- str_extract(tolower(df$Description), word_to_search)
df
#    PartNo   Description ProductType
# 1 A000443  Water Bottle       water
# 2 A000445 Contain Water       water
# 3 A000448  WaterBotHold       water
# 4   HRZ55   Hershey_Bar         bar
# 5   RRB55  Candy Energy        <NA>    #Didn't match with Water/Bar
# 6   QMU55   Bar Protein         bar

Данные:

df <- read.table(text = 
"PartNo  Description 
A000443 'Water Bottle' 
A000445 'Contain Water'
A000448 WaterBotHold 
HRZ55   Hershey_Bar  
RRB55   'Candy Energy' 
QMU55   'Bar Protein'",
stringsAsFactors = FALSE, header = TRUE)
...