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

如何在提取textacy SVO三元组时对动词进行词形还原?

获取词形还原后的SVO三元组解决方案

错误原因分析

  • TypeError: 'spacy.tokens.token.Token' object is not subscriptable:你直接将spaCy的Token对象存入DataFrame,后续操作时误将其当作字符串/列表进行下标访问,导致报错。
  • AttributeError: 'str' object has no attribute 'sents':textacy提取SVO必须传入spaCy处理后的Doc对象,而你传入了词形还原后的纯文本字符串,纯字符串不具备sents属性。

正确实现步骤

核心思路:基于spaCy的Doc对象提取SVO,同时直接对动词Token调用.lemma_属性完成词形还原,无需提前修改原始文本,也不用事后处理DataFrame中的Token对象。

修改后的SVO生成函数

def createSVOs(doc, svo_list):
    # 从spaCy Doc对象提取SVO三元组
    svotriples = list(textacy.extract.triples.subject_verb_object_triples(doc))
    for item in svotriples:
        svo_list.append(
            {
                'subject': str(item[0][-1]),
                # 直接调用Token的lemma_属性获取词形还原后的动词
                'verb': item[1][-1].lemma_,
                'object': str(item[2])
            }
        )

完整流程代码

import pandas as pd
import spacy
import textacy

# 1. 加载数据并预处理文本
texts_women = talks_f.text.tolist()
texts_w = [text.lower() for text in texts_women]

# 2. 初始化spaCy管道并处理文本,得到Doc对象列表
nlp = spacy.load('en_core_web_sm')
docs_w = list(nlp.pipe(texts_w))

# 3. 生成带词形还原动词的SVO列表
svo_list = []
for doc in docs_w:
    createSVOs(doc, svo_list)

# 4. 转换为DataFrame
svo_df = pd.DataFrame(svo_list)

关键注意点

  • 禁止直接将spaCy的Token或Span对象存入DataFrame,必须转为字符串或提取特定属性(如lemma_、text)。
  • textacy的所有提取工具都依赖spaCy的Doc对象,不能传入纯文本字符串,否则会丢失语法分析的核心信息。
  • spaCy自带的词形还原功能可直接处理动词的各种变形(过去式、进行时等),通过Token的.lemma_属性即可获取归一化后的动词原型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:01:00