如何为spaCy处理结果关联文本元数据并生成预期结构化输出
spaCy语料处理关联元数据问题解决方案
问题1:docs列存储文本而非spaCy Doc对象的修复
正常情况下nlp.pipe()返回的结果确实是spaCy Doc类型的列表,出现自动转文本的情况是pandas的隐式类型转换导致的,可以在赋值时强制指定列类型为object即可解决:
import spacy import pandas as pd nlp = spacy.load('en_core_web_sm') df = pd.read_excel('C:/Users/Desktop/Data.xlsx') # 强制指定object类型,避免Doc对象被转为字符串 df['docs'] = pd.Series(list(nlp.pipe(df.text_field)), dtype='object')
赋值后可以执行print(type(df['docs'][0]))验证,输出为<class 'spacy.tokens.doc.Doc'>就代表存储正常。
问题2:提取分词同时关联元数据的实现
Python配合spaCy完全可以实现类似R Quanteda的元数据关联功能,不需要依赖额外库,两种实现方式可选:
方式1:遍历DataFrame行关联(适合小规模语料)
直接逐行读取元数据和处理好的Doc对象,拼接分词属性后统一输出为结构化表格:
result = [] # 遍历每行数据,同时提取元数据和Doc for _, row in df.iterrows(): # 可根据需求增删需要带出的元数据字段 meta = { "file": row["文件名"], "gender": row["性别"], "nationality": row["国籍"] } doc = row["docs"] # 遍历分词拼接结果 for token in doc: result.append({ **meta, "lemma": token.lemma_, "text": token.text, "pos_": token.pos_ }) # 转成DataFrame即得到预期格式的结果,可直接导出 result_df = pd.DataFrame(result) result_df.to_excel("带元数据的分词结果.xlsx", index=False)
方式2:nlp.pipe绑定元数据处理(适合大规模语料,效率更高)
利用spaCy原生支持的as_tuples参数,直接把文本和元数据绑定后送入管道处理,省去后续匹配元数据的步骤,运行速度更快:
result = [] # 组装(文本, 元数据)的元组列表 text_meta_tuples = df.apply(lambda x: (x["text_field"], (x["文件名"], x["性别"], x["国籍"])), axis=1).tolist() # 管道处理时直接返回(doc, 元数据)对 for doc, (file_name, gender, nationality) in nlp.pipe(text_meta_tuples, as_tuples=True): for token in doc: result.append({ "file": file_name, "gender": gender, "nationality": nationality, "lemma": token.lemma_, "text": token.text, "pos_": token.pos_ }) result_df = pd.DataFrame(result)
内容的提问来源于stack exchange,提问作者Fatih Bozdağ
相关产品推荐
相关产品推荐

