如何将时长类文本字段转换为数值?求NLP模型或实现方案
时长文本转数值解决方案
一、场景适配性说明
- 你的数据格式高度结构化,仅包含有限几种模式(单值/范围值+单位、纯数值、大小写/空格差异),规则引擎比NLP模型更精准、高效——不需要训练模型,100条标注数据用来验证规则足够,完全没必要浪费在模型训练上。
- NLP模型(如微调小模型、NER实体识别)反而会引入不必要的误差,且需要更多标注数据才能稳定输出,对你的场景来说性价比极低。
二、R语言实现脚本
针对你的示例数据,以下脚本可处理所有场景:统一文本格式、提取数值(范围取最大值)、匹配单位转换为天数、处理特殊单位。
library(stringr) library(dplyr) # 示例数据 text_fields <- c("10 - 14 days", "2-3 Weeks", "10-12 days", "8 days", "8-12 days", "10 days", "7-10 days", "5 days", "7-10 days", "5-7 days", "10 days", "7 days", "7 - 10 days", "1 week", "5-7 days", "2 weeks", "2-4 weeks", "10 days", "7-10 days", "8-10 days", "1 week", "10 days", "8-10 days", "2 weeks", "10-12 days", "7-10 days", "2-3 weeks", "7-10 days", "10 days", "2 weeks", "8-12 days", "12 days", "10 Days", "7 Days", "2 weeks", "5-8 days", "8-12 days", "8-12 days", "10 days", "12-14 days", "10-12 days", "7 days", "5-7 days", "2 weeks", "2-3 weeks", "5-7 days", "5-7 business days", "5-7 days", "5-7 business days", "7 days", "2-3 weeks", "7-10 days", "8-12 Days", "10 days", "10 days", "10 days", "10 days", "10 days", "14", "2 weeks", "10 business days", "2-3 weeks", "4 days", "1 month", "7-10 days", "8-12 days", "2-3 weeks", "3-5 days", "10 days", "3-5 days", "2-3 days", "2-3 days", "3-5", "5-7 days", "7-10 days", "5-7 days", "8-12 days", "7-10 days", "7-10 days", "7-10 days", "2.5 weeks", "2 Weeks", "10-12 days", "10-12 days", "7-10 days", "7-10 days", "7-10 days", "7-10 days", "7-10 days", "7-10 days", "2 weeks", "1 month", "1 month", "1 week" ) # 定义转换函数 convert_duration <- function(text) { # 统一格式:小写、去除多余空格、替换" - "为"-" clean_text <- str_to_lower(str_replace_all(text, "\\s+-\\s+", "-")) %>% str_squish() # 提取所有数值(包括小数) nums <- str_extract_all(clean_text, "\\d+\\.?\\d*") %>% unlist() %>% as.numeric() if (length(nums) == 0) return(NA) # 取最大值 max_num <- max(nums, na.rm = TRUE) # 判断单位并转换 if (str_detect(clean_text, "week")) { max_num * 7 } else if (str_detect(clean_text, "month")) { max_num * 30 # 可按需调整为30/31/28等 } else if (str_detect(clean_text, "year")) { max_num * 365 # 可按需调整 } else { # 默认按天处理(包括纯数值、days、business days) max_num } } # 应用函数并输出结果 result <- sapply(text_fields, convert_duration) data.frame(original_text = text_fields, converted_days = result)
三、Python语言实现脚本
逻辑与R一致,适合习惯Python的场景:
import re import pandas as pd # 示例数据 text_fields = [ "10 - 14 days", "2-3 Weeks", "10-12 days", "8 days", "8-12 days", "10 days", "7-10 days", "5 days", "7-10 days", "5-7 days", "10 days", "7 days", "7 - 10 days", "1 week", "5-7 days", "2 weeks", "2-4 weeks", "10 days", "7-10 days", "8-10 days", "1 week", "10 days", "8-10 days", "2 weeks", "10-12 days", "7-10 days", "2-3 weeks", "7-10 days", "10 days", "2 weeks", "8-12 days", "12 days", "10 Days", "7 Days", "2 weeks", "5-8 days", "8-12 days", "8-12 days", "10 days", "12-14 days", "10-12 days", "7 days", "5-7 days", "2 weeks", "2-3 weeks", "5-7 days", "5-7 business days", "5-7 days", "5-7 business days", "7 days", "2-3 weeks", "7-10 days", "8-12 Days", "10 days", "10 days", "10 days", "10 days", "10 days", "14", "2 weeks", "10 business days", "2-3 weeks", "4 days", "1 month", "7-10 days", "8-12 days", "2-3 weeks", "3-5 days", "10 days", "3-5 days", "2-3 days", "2-3 days", "3-5", "5-7 days", "7-10 days", "5-7 days", "8-12 days", "7-10 days", "7-10 days", "7-10 days", "2.5 weeks", "2 Weeks", "10-12 days", "10-12 days", "7-10 days", "7-10 days", "7-10 days", "7-10 days", "7-10 days", "7-10 days", "2 weeks", "1 month", "1 month", "1 week" ] def convert_duration(text): # 统一格式:小写、去除多余空格、替换" - "为"-" clean_text = re.sub(r'\s+-\s+', '-', text.strip()).lower() # 提取所有数值(包括小数) nums = re.findall(r'\d+\.?\d*', clean_text) if not nums: return None nums = [float(num) for num in nums] max_num = max(nums) # 判断单位并转换 if 'week' in clean_text: return max_num * 7 elif 'month' in clean_text: return max_num * 30 # 可按需调整 elif 'year' in clean_text: return max_num * 365 # 可按需调整 else: # 默认按天处理 return max_num # 应用函数并输出结果 results = [convert_duration(text) for text in text_fields] df = pd.DataFrame({'original_text': text_fields, 'converted_days': results}) print(df)
四、补充说明
- 脚本已覆盖大小写差异、空格差异(如"10 - 14"和"10-14")、带"business"的情况、纯数值(如"14"默认按天)、小数(如"2.5 weeks"转为17.5天)。
- 若新增单位(如"quarter"),只需在判断逻辑中添加对应转换规则即可。
- 少数格式异常的文本会返回NA/None,可收集后单独处理或补充规则覆盖。
内容的提问来源于stack exchange,提问作者Stephen Poole
相关产品推荐
相关产品推荐

