R stringR RegExp 策略,用于在没有先验知识的情况下对类似表达式进行分组

R stringR RegExp strategy for grouping like expressions without prior knowledge

我有一个 50K+ 部件号的列表。我需要按产品类型对它们进行分组。零件号通常在顺序上彼此接近,尽管它们不是完全连续的。产品描述总是相似的,但不遵循最佳规则。让我用下面的例子来说明 table.

| 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 for 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", ""
)

你可以试试stringr::str_extract。它适用于由 |.

分隔的多个单词

更新:

OP 建议查找为 ProductType 的词是未知的,应根据 Description 列中不同词的频率来决定这些词。

一个选项是使用 qdap 包来查找不同单词的频率和 select 顶部 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)