【发布时间】:2018-12-24 04:50:26
【问题描述】:
我是 json 项目操作的新手。目前,我正在做一个 NLP 项目。我正在使用 Spacy 构建 NER 模型。对于注释,我使用了 dataturks.com 注释服务。他们给出了一个格式化的 JSON 文件 示例 json 项目是这样的。准确地说,这个 json 项来自 CSV 文件
{"content": "Canada,Airdrie,Alberta,M1B 0V1 ,418-555-0122","annotation":[{"label":["Phone Number"],"points":[{"start":32,"end":43,"text":"418-555-0122"}]},{"label":["Postal Code"],"points":[{"start":23,"end":29,"text":"M1B 0V1"}]},{"label":["Province"],"points":[{"start":15,"end":21,"text":"Alberta"}]},{"label":["City"],"points":[{"start":7,"end":13,"text":"Airdrie"}]},{"label":["Country"],"points":[{"start":0,"end":5,"text":"Canada"}]}],"extras":null,"metadata":{"first_done_at":1545039231000,"last_updated_at":1545039231000,"sec_taken":50,"last_updated_by":"eODxmFU8wjPq8GJrmJtb0s7Wn9u1","status":"done","evaluation":"NONE"}}
{"content": "Canada,Barrie,Ontario,J2K 3C7 ,418-555-0135","annotation":[{"label":["Phone Number"],"points":[{"start":31,"end":42,"text":"418-555-0135"}]},{"label":["Postal Code"],"points":[{"start":22,"end":28,"text":"J2K 3C7"}]},{"label":["Province"],"points":[{"start":14,"end":20,"text":"Ontario"}]},{"label":["City"],"points":[{"start":7,"end":12,"text":"Barrie"}]},{"label":["Country"],"points":[{"start":0,"end":5,"text":"Canada"}]}],"extras":null,"metadata":{"first_done_at":1545157658000,"last_updated_at":1545157658000,"sec_taken":21,"last_updated_by":"eODxmFU8wjPq8GJrmJtb0s7Wn9u1","status":"done","evaluation":"NONE"}}
{"content": "Canada,Brandon,Manitoba,B1A 2X0 ,418-555-0171","annotation":[{"label":["Phone Number"],"points":[{"start":33,"end":44,"text":"418-555-0171"}]},{"label":["Postal Code"],"points":[{"start":24,"end":30,"text":"B1A 2X0"}]},{"label":["Province"],"points":[{"start":15,"end":22,"text":"Manitoba"}]},{"label":["City"],"points":[{"start":7,"end":13,"text":"Brandon"}]},{"label":["Country"],"points":[{"start":0,"end":5,"text":"Canada"}]}],"extras":null,"metadata":{"first_done_at":1545113770000,"last_updated_at":1545113770000,"sec_taken":27,"last_updated_by":"eODxmFU8wjPq8GJrmJtb0s7Wn9u1","status":"done","evaluation":"NONE"}}
我的代码 sn-p 是
trainingfilename="C:/Users/codemen/Desktop/Timeseries Analytics/Canadianinfo.json"
logging.basicConfig(level=logging.INFO)
def ConvertDataturkToSpacy(trainingfilename):
try:
trainingData=[]
lines=[]
# reading file and formating part
with open(trainingfilename,'r') as f:
lines=f.readlines()
for line in lines:
data=json.loads(line)
#wprint(data)
text=data['content']
print("Mytext",text)
entities=[]
#print('entties',entities)
for annotation in data['annotation']:
#print("Here is the thing")
points=annotation['points'][0] #single point annotation part
#print(point)
labels=annotation['label']
print(labels)
#print("type",type(labels))
if not isinstance(labels,list):#handling both list of labels or single label
labels=[labels]
# print("instance",labels)
for label in labels:
#dataturks indices are inclusive but spacy indices are not so dealing with it by adding with +1
#print("Test here")
#print ("label")
#print("priniting label")
#print(label)
#print(" inside type",type(label))
# print(points['start'],points["end"]+1,label)
entities.append((points["start"],points["end"]+1,label))
#entities.append({points['start'],points["end"]+1,label})
#print("MyEntities",entities)
trainingData.append((text,{"entities":entities}))
return trainingData
#print("TrainingData",trainingData)
#print("Datatype",type(trainingData))
#return trainingData
except Exception as e:
logging.exception("Unable to process item" + trainingfilename +"\n"+ "errror ="+str(e))
return None
TrainingData=ConvertDataturkToSpacy(trainingfilename)
我已经注释掉了我想要的返回语句,如果我把它放在那里它会显示None type object not iterable error。所以为了测试目的,我在 for 循环中放了一个 return 语句,它实际上返回了一个列表,这是我文件中的第一个 json 项
[('Canada,Airdrie,Alberta,M1B 0V1 ,418-555-0122', {'entities': [(32, 44, 'Phone Number'), (23, 30, 'Postal Code'), (15, 22, 'Province'), (7, 14, 'City'), (0, 6, 'Country')]})]
我想要的列表是这样的,但是有 1000 个这样的列表元素。所以我认为我没有正确操作 JSON。请帮我解决这个问题 谢谢
【问题讨论】:
-
这里有两个指针,将
trainingData=[]从try块中取出并检查。尝试将 text=data['content'] 替换为text=data['content'].copy() -
感谢您的回复,我试过了,但是替换 text=data['content'].copy() 给我的 'str' 对象没有属性 'copy'。并将 trainingData[] 放在外面尝试块不起作用:)
标签: python json python-3.x spacy