手动复制Flair NER模型输出构建列表时出现语法错误问题
问题排查:Flair模型输出手动赋值报错的原因及解决办法
在使用Flair和Hugging Face Transformers开发时,尝试手动复制模型输出的文本格式赋值给变量触发语法错误。模型返回的solu1是可遍历的列表对象,但手动写的solu2无法运行,代码及报错如下:
from flair.data import Sentence from flair.models import SequenceTagger from transformers import pipeline class Klassensetzer: def __init__(self): self.tagger = SequenceTagger.load("flair/ner-german-large") self.classifier = pipeline('sentiment-analysis') self.content=None def TK_model(self,content): sentence = Sentence(content) self.tagger.predict(sentence) self.content=(sentence.get_spans('ner')) return self.content K=Klassensetzer() solu1=K.TK_model("Augustus besucht Berlin") #Means Augustus visits Berlin print(solu1) #Output: [Span[0:1]: "Augustus" → PER (1.0), Span[2:3]: "Berlin" → LOC (1.0)] #Does work out solu2=[Span[0:1]: "Augustus" → PER (1.0), Span[2:3]: "Berlin" → LOC (1.0)] print(solu2) #Output: SyntaxError: invalid syntax #Didn't worked out after the second use
错误原因
- 你复制的是对象的字符串表示形式,不是合法的Python语法。
Span[0:1]: "Augustus" → PER (1.0)是Flair的Span对象被print()时输出的可读性文本,仅用于方便开发者查看,不是能直接赋值的Python代码。 - Python解释器无法识别
Span[0:1]:这种语法,这只是对象的友好展示格式,不是创建Span对象的正确方式。
手动构建等效对象的方法
如果需要手动创建和solu1一致的列表,必须通过Flair提供的API来实例化Span对象:
from flair.data import Sentence, Span # 先创建原句子对应的Sentence对象(Span依赖Sentence上下文) sentence = Sentence("Augustus besucht Berlin") # 调用Span构造方法创建实体 augustus_span = Span(sentence, start_position=0, end_position=1, label="PER", score=1.0) berlin_span = Span(sentence, start_position=2, end_position=3, label="LOC", score=1.0) # 组成列表 solu2 = [augustus_span, berlin_span] print(solu2) # 输出与solu1一致:[Span[0:1]: "Augustus" → PER (1.0), Span[2:3]: "Berlin" → LOC (1.0)]
调试替代方案
如果只是为了跳过模型推理加速调试,建议用序列化方式保存/加载实体数据:
import json # 保存:将Span对象的关键信息转为字典并写入文件 spans_data = [ {"start": s.start_position, "end": s.end_position, "label": s.label.value, "score": s.score} for s in solu1 ] with open("spans.json", "w") as f: json.dump(spans_data, f) # 加载:从文件读取数据,重建Span对象 with open("spans.json", "r") as f: spans_data = json.load(f) sentence = Sentence("Augustus besucht Berlin") solu2 = [ Span(sentence, d["start"], d["end"], d["label"], d["score"]) for d in spans_data ]
内容的提问来源于stack exchange,提问作者artMart
相关产品推荐
相关产品推荐

