如何在提取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
相关产品推荐
相关产品推荐

