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

如何将时长类文本字段转换为数值?求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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:50:27