【问题标题】:How to assign a numerical code to a string based on a set of keywords in R如何根据R中的一组关键字为字符串分配数字代码
【发布时间】:2020-05-24 13:10:47
【问题描述】:

例如,我有一个数据数组,其中一些文本描述如下:

  1. 大泳池房

  2. 1层仓库

  3. 多个存储池

现在,我想根据子字符串对文本描述进行编码。例如,如果文本中有字符串“pool”,那么我想为整个文本描述分配一个数字代码(例如,101)。

如果文本描述中有多个字符串(例如“存储”和“池”),那么我想为这些描述分配多个代码并连接/粘贴这些代码。例如,在描述的情况下 - “多个存储池”,我会将代码(例如,102)分配给存储,将 101 分配给池。所以,结果应该是 (102, 101)。

谁能为此推荐一个 R 算法?

【问题讨论】:

  • 在 R 的 keras 包中,有一个 text_tokenizer 函数,它可以适合文本体以生成某些标记(通常是单词)的数字表示。然后,您可以使用 texts_to_sequences 生成您提到的数字序列。示例见此处:jjallaire.github.io/deep-learning-with-r-notebooks/notebooks/…
  • Soundex?例如,参见?stringdist::stringdist。但这很大程度上是基于意见的,是投票结束的理由。 (我还没有,至少现在还没有)你能展示你尝试过的东西吗?
  • @Valeri Voev, @ Rui Barradas -- 非常感谢

标签: r string multidimensional-array text


【解决方案1】:

数据

data <- c("Big Pool House", "1 Store Warehouse", "Multiple Storage Pool")

首先定义要在数据中搜索的关键字和对应的代码

tags <- c("Storage", "Pool", "Warehouse")
ids <- c(102, 101, 103)

然后使用

lapply(data, function(x) ids[which(sapply(tags, function(y) grepl(y, x)))])
[[1]]
[1] 101

[[2]]
[1] 103

[[3]]
[1] 102 101

编辑 1 考虑到 @Valeri Voev 对 grepl 中的论点 ignore.case 的评论。

默认情况下,函数 grepl 区分大小写。如果在数据中,有时您有一个小写的关键字,有时是大写的,请使用参数ignore.case 和值TRUE,以便函数忽略大小写。

例如,如果数据中包含大小写格式的单词“pool”

data <- c("Big Pool House", "1 Store Warehouse", "Multiple Storage pool")

使用

lapply(data, function(x) {
  ids[which(sapply(tags, function(y) grepl(y, x, ignore.case = TRUE)))]
})

如果您离开ignore.case = FALSE(默认),grepl 将不会检测到“池”在最后一个元素中,并且不会为其分配代码 101。


编辑 2 以 OP 的两个额外要求来补充答案,但在问题中未说明,但在评论中。

  • 要使用逗号分隔代码,您可以使用函数pastecollapse = ','
  • 要使其成为数据框,最好使用sapply 而不是lapply,以便将输出作为字符向量而不是列表。

全部加起来就是

codes <- unname(sapply(data, function(x) {
  paste(ids[which(sapply(tags, function(y) grepl(y, x)))], collapse = ",")
}))
data.frame(Data = data, Codes = codes)
                   Data   Codes
1        Big Pool House     101
2     1 Store Warehouse     103
3 Multiple Storage Pool 102,101

【讨论】:

  • grepl 有一个 ignore.case 参数,可以将其设置为 TRUE 以覆盖区分大小写。
  • 好的...输出如我所愿。是否可以通过逗号 (",") 分隔值连接/粘贴数字并使其成为数据框。
  • 查看编辑 2。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多