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

如何使用NLTK特定名-动-名词性标签模式从文本提取短语?

解决思路与代码实现

核心逻辑

你要提取的是1个及以上名词 + 1个动词 + 1个名词的短语,本质是通过正则匹配词性标签序列,再映射回原分词文本即可实现需求。

具体步骤

  • 基于已完成的分词和pos_tag词性标注,提取每个句子的词性标签序列。
  • 用正则表达式匹配符合[1+名词标签] + [动词标签] + [名词标签]的模式(兼容NLTK中NN、NNS、VB、VBD等衍生词性标签)。
  • 定位匹配到的标签序列对应的分词片段,拼接成目标短语。

代码实现

假设你的DataFrame文本列名为text,示例代码如下:

import pandas as pd
import re
from nltk import pos_tag, word_tokenize

# 示例DataFrame
df = pd.DataFrame({'text': ['cat chase mouse', 'dog cat fetch bone', 'bird fly to tree']})

# 定义词性匹配正则:兼容所有NN/VB衍生标签,匹配1+名词+动词+名词的序列
pattern = re.compile(r'(?:NN\w*\s+)+VB\w*\s+NN\w*')

def extract_target_phrases(text):
    tokens = word_tokenize(text)
    tagged_pairs = pos_tag(tokens)
    # 把词性标签拼接成空格分隔的字符串,方便正则匹配
    tag_sequence = ' '.join([tag for _, tag in tagged_pairs])
    # 找出所有符合模式的标签片段
    matched_tags = pattern.findall(tag_sequence)
    
    target_phrases = []
    for tag_fragment in matched_tags:
        tag_list = tag_fragment.split()
        # 定位该标签片段在原标注序列中的起始位置
        start_idx = None
        for i in range(len(tagged_pairs) - len(tag_list) + 1):
            if [tag for _, tag in tagged_pairs[i:i+len(tag_list)]] == tag_list:
                start_idx = i
                break
        # 拼接对应位置的分词,得到短语
        if start_idx is not None:
            phrase = ' '.join([word for word, _ in tagged_pairs[start_idx:start_idx+len(tag_list)]])
            target_phrases.append(phrase)
    return target_phrases

# 应用到DataFrame生成结果列
df['extracted_phrases'] = df['text'].apply(extract_target_phrases)
print(df)

关键说明

  • 正则模式(?:NN\w*\s+)+VB\w*\s+NN\w*:
    • (?:NN\w*\s+)+:匹配1个及以上名词类标签(NN、NNS、NNP等都被覆盖),?:用于避免生成多余捕获组。
    • VB\w*:匹配所有动词类标签(VB、VBD、VBG、VBN等)。
    • NN\w*:匹配结尾的名词类标签。
  • 若需严格匹配基础词性(比如仅NN和VB),可将NN\w*改为NN、VB\w*改为VB,按需调整即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:16:30