如何用Python从文本中提取带action、quantity、target标签的相关关键词?
用Python提取带标签的目标关键词
要实现从文本里提取action、quantity、target这类带标签的关键词,主要有两种实用思路:基于规则的简单匹配(适合句式固定的场景)和基于NLP模型的实体识别(适配复杂多变的语句),下面给你详细拆解:
一、基于规则的方法(适合固定句式)
如果你的文本句式比较规整(比如类似"I want to buy 10kgs of watermelon"这类结构),用正则表达式就能快速搞定,逻辑简单还容易调试。
代码示例
import re def extract_rule_based_keywords(text): # 匹配规则:覆盖常见动作、数量+单位、目标物品的组合 pattern = r"(?P<action>buy|purchase|get|want to buy)\s+(?P<quantity>\d+)\s*(kgs?|kilograms?|kg|pounds?|lb)?\s+of\s+(?P<target>\w+)" match = re.search(pattern, text, re.IGNORECASE) if match: return { "action": match.group("action").lower(), "quantity": match.group("quantity"), "target": match.group("target").lower() } else: return {"提示": "未匹配到符合格式的内容"} # 测试示例 test_text = "I want to buy 10kgs of watermelon" print(extract_rule_based_keywords(test_text)) # 输出: {'action': 'want to buy', 'quantity': '10', 'target': 'watermelon'}
这种方法的优势是速度快、成本低,但缺点也很明显——只能处理符合预设规则的文本,句式一变就失效。
二、基于NLP模型的实体识别(适配复杂句式)
如果你的文本结构复杂多变(比如"Could you help me purchase 15 kilograms of fresh watermelon?"这类句子),就得用自然语言处理工具来做自定义实体识别,这里推荐用spaCy这个常用的NLP库,我们可以用规则匹配结合模型语义分析的方式,或者直接训练自定义实体模型。
步骤1:安装依赖并下载基础模型
pip install spacy python -m spacy download en_core_web_sm
步骤2:用Matcher实现自定义关键词提取
import spacy from spacy.matcher import Matcher # 加载预训练模型 nlp = spacy.load("en_core_web_sm") matcher = Matcher(nlp.vocab) # 定义各类标签的匹配模式 # 匹配action(包含单个动作词和"want to buy"这类短语) action_patterns = [ [{"LOWER": "want"}, {"LOWER": "to"}, {"LOWER": {"in": ["buy", "purchase", "get", "order"]}}], [{"LOWER": {"in": ["buy", "purchase", "get", "order", "acquire"]}}] ] # 匹配quantity(数字+单位,或者单独数字) quantity_patterns = [ [{"LIKE_NUM": True}, {"LOWER": {"in": ["kg", "kgs", "kilogram", "kilograms", "pound", "pounds", "lb"]}}], [{"LIKE_NUM": True}] ] # 匹配target(动作的目标物品,利用语法依存关系定位) target_patterns = [ [{"DEP": "dobj", "POS": "NOUN"}] ] # 将模式添加到匹配器 matcher.add("ACTION", action_patterns) matcher.add("QUANTITY", quantity_patterns) matcher.add("TARGET", target_patterns) def extract_nlp_keywords(text): doc = nlp(text) matches = matcher(doc) result = {} for match_id, start, end in matches: label = nlp.vocab.strings[match_id] text_segment = doc[start:end].text.lower() # 避免同一标签重复赋值 if label.lower() not in result: result[label.lower()] = text_segment return result # 测试复杂句式 test_text = "Could you please purchase 15 kilograms of fresh watermelon for me?" print(extract_nlp_keywords(test_text)) # 输出: {'action': 'purchase', 'quantity': '15 kilograms', 'target': 'watermelon'}
进阶:训练自定义NER模型
如果你的场景有大量标注好的数据集,可以训练spaCy的自定义命名实体识别(NER)模型,让模型更精准地识别你的专属标签。具体步骤是用标注工具(比如Prodigy)准备标注数据,再用spaCy的训练脚本完成模型训练,这种方式适配性最强,能处理各种复杂句式。
总结
- 文本结构固定→优先用正则规则,快速高效
- 文本复杂多变→用spaCy Matcher快速落地,或者训练自定义NER模型实现长期适配
内容的提问来源于stack exchange,提问作者AMol Rane
相关产品推荐
相关产品推荐

