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

Python生成词性标注JSON仅保留最后一个动词时态不定式问题求助

问题原因
  • 你将Tense、Infinitive两个键直接定义在根级data字典下,每次遍历到新动词时,都会直接覆盖这两个键的旧值,遍历结束后自然只会保留最后一个动词的对应信息。
  • 现有逻辑用单词文本作为data的键,若文本中出现重复单词,后出现的单词词性也会覆盖先出现的同名单词的词性,同样会造成数据丢失。
解决方案

你需要调整数据存储结构,将每个单词的所有属性(包括基础词性、动词专属的时态和不定式)都存在该单词对应的取值内,不要把动词专属属性放在根层级。如果需要保留所有出现过的token(包括文本重复的),建议改用列表存储所有token信息。

修改后代码示例(保留单词为键的结构,适合无重复单词的场景)

import spacy
import json

# 模型加载、自定义类实例化放在函数外,避免每次调用重复加载浪费资源
nlp = spacy.load("en_core_web_trf")
x = english() 

def eng_pos(textstr):    
    data = {}
    doc = nlp(textstr)
    for token in doc:
        token_info = {
            "pos": token.pos_
        }
        if token.pos_ == "VERB":
            token_info["Tense"] = token.morph.get("Tense")
            token_info["Infinitive"] = x.infinitive(token.text)
        data[token.text] = token_info
        print(f"{token.text} {token.pos_}")
    json_data = json.dumps(data, ensure_ascii=False)
    print(json_data)
    return json_data

修改后代码示例(用列表存储所有token,适合有重复单词的场景)

import spacy
import json

nlp = spacy.load("en_core_web_trf")
x = english() 

def eng_pos(textstr):    
    data = []
    doc = nlp(textstr)
    for token in doc:
        token_info = {
            "text": token.text,
            "pos": token.pos_
        }
        if token.pos_ == "VERB":
            token_info["Tense"] = token.morph.get("Tense")
            token_info["Infinitive"] = x.infinitive(token.text)
        data.append(token_info)
        print(f"{token.text} {token.pos_}")
    json_data = json.dumps(data, ensure_ascii=False)
    print(json_data)
    return json_data

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:24:08