You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

文本挖掘:如何从建筑计划自由文本字段拆分建筑数量与类型?

解决方案:拆分建筑计划文本为数量与类型列

嘿,我来帮你搞定这个问题!你需要从自由文本的建筑计划里拆分出建筑数量和对应的建筑类型,而且已经有了参考的类型列表,咱们用stringr包(R里处理字符串的利器)就能轻松实现,下面是具体步骤:

步骤1:准备数据和必要的包

首先加载处理字符串和数据框的工具包,然后定义你的原始数据:

# 加载需要的包
library(stringr)
library(dplyr)

# 原始计划文本
Plans <- c("build 10 houses ", "5 luxury apartments with sea view", "renovate 20 cottages"," transform 2 bungalows and a school", "1 hotel")
# 参考建筑类型列表
Types <- c("houses", "cottages", "bungalows", "luxury apartments")

步骤2:构建精准的类型匹配规则

因为你的类型列表里有像luxury apartments这种多词的类型,咱们得先把类型按长度从长到短排序,这样长类型会优先被匹配,避免被短类型截断(比如不会把luxury apartments误判成apartments):

# 按类型长度倒序排序,确保多词类型优先匹配
sorted_types <- Types[order(-nchar(Types))]
# 构建正则匹配模式,\\b保证匹配完整单词
type_pattern <- paste0("\\b(", paste(sorted_types, collapse = "|"), ")\\b")

步骤3:提取建筑数量

用正则\\d+匹配文本里的数字(一个或多个连续数字),提取后转成整数类型:

Number <- str_extract(Plans, "\\d+") %>% as.integer()

步骤4:提取并转换建筑类型

先匹配参考列表里的类型,再根据你的期望输出(把luxury apartments转为apartments)做映射替换:

# 提取匹配到的参考类型
Type <- str_extract(Plans, type_pattern)

# 构建类型映射,把带修饰词的类型转为你想要的简化名称
type_mapping <- c(
  "luxury apartments" = "apartments",
  "houses" = "houses",
  "cottages" = "cottages",
  "bungalows" = "bungalows"
)
# 替换类型名称
Type <- type_mapping[Type]

步骤5:组合结果并过滤无效记录

把数量和类型组合成数据框,同时过滤掉没有匹配到参考类型的记录(比如1 hotel,因为hotel不在你的参考列表里):

result <- tibble(Number, Type) %>%
  filter(!is.na(Type))

# 查看结果
print(result)

运行后你会得到完全符合期望的输出:

# A tibble: 4 × 2
  Number Type      
   <int> <chr>     
1     10 houses    
2      5 apartments
3     20 cottages  
4      2 bungalows 

为什么之前的尝试没成功?

  • 用grep只能筛选出包含类型的文本,但无法拆分数字和类型;
  • 直接用str_split_fixed结合[:digit:]/[:alpha:]的话,无法处理多词类型(比如luxury apartments会被拆成多个部分),也没法精准匹配你的参考类型列表。

如果不想用dplyr,用基础R也能实现,把最后一步换成:

result <- data.frame(Number, Type)
result <- result[!is.na(result$Type), ]

内容的提问来源于stack exchange,提问作者Babette

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:23:11