#python #json
#python #json
Вопрос:
У меня есть набор данных, который представляет одно предложение проанализированного текста и выглядит следующим образом:
[{
"address": 1,
"ctag": "Ne",
"feats": "_",
"head": 6,
"lemma": "Ashraf",
"rel": "SBJ",
"tag": "Ne",
"word": "Ashraf"
}, {
"address": 2,
"ctag": "AJ",
"feats": "_",
"head": 1,
"lemma": "Ghani",
"rel": "NPOSTMOD",
"tag": "AJ",
"word": "Ghani"
}, {
"address": 3,
"ctag": "P",
"feats": "_",
"head": 6,
"lemma": "in",
"rel": "ADV",
"tag": "P",
"word": "in"
}, {
"address": 4,
"ctag": "N",
"feats": "_",
"head": 3,
"lemma": "Kabul",
"rel": "POSDEP",
"tag": "N",
"word": "Kabul"
}, {
"address": 5,
"ctag": "N",
"feats": "_",
"head": 6,
"lemma": "born",
"rel": "NVE",
"tag": "N",
"word": "born"
}, {
"address": 6,
"ctag": "V",
"feats": "_",
"head": 0,
"lemma": "شدشو",
"rel": "ROOT",
"tag": "V",
"word": "شده_است"
}, {
"address": 7,
"ctag": "PUNC",
"feats": "_",
"head": 6,
"lemma": ".",
"rel": "PUNC",
"tag": "PUNC",
"word": "."
}]
В "Adress": 7
, "ctag":"PUNC"
настоящем конце предложения. Мой исходный набор данных содержит несколько предложений. Во-первых, я хочу определить, что это первое предложение, из каждого предложения, которое заканчивается на PUNC
или .
, я хочу сначала проверить, в первом предложении, чтобы извлечь специальные two or three
объекты, такие как 'ctag'='Ne'
и для следующего слова, 'ctag'= 'N'
, затем связь между этими двумя объектами, 'rel'= 'NVE'
и затем это должно быть сохранено в списке.
Что я сделал:
# read file
with open('../data/parse.txt', 'r') as myfile:
obj = json.load(myfile)
for w in obj:
if w['ctag'] == 'Ne' and w['rel'] == 'SBJ':
n1.append(w['word'])
if w['ctag'] == 'N' and w['rel'] == 'SBJ':
n6.append(w['word'])
if w['ctag'] == 'N' and w['rel'] == 'MOZ':
n2.append(w['word'])
if w['rel'] == 'NVE' and w['ctag'] == 'N':
n3.append(w['word'])
if w['rel'] == 'MOZ' and w['ctag'] =='Ne':
n4.append(w['word'])
if w['rel'] =='MOS' and w['ctag'] == 'Ne':
n5.append(w['word'])
if w['rel'] == 'OBJ' and w['ctag'] == 'N':
n7.append(w['word'])
Это означает, что по 27
адресу я нашел это количество объектов:
rel=SBJ amp; Ne: ['Ashraf']
rel=MOZ amp; Ne ['President', 'Capital', 'Lecturer', 'University']
rel=MOS amp; Ne ['Ashraf', 'Kabul', 'Ahmad']
rel=MOZ amp; N ['Afghanistan', 'Afghanistan', 'Kabul']
rel=NVE amp; N ['born']
rel=SBJ amp; N ['Kabul']
rel=OBJ amp; N ['Located']
Чего я хочу:
— Он должен найти первое "."
или "PUNC"
, а затем в этом первом предложении проверить объекты, поэтому я обнаружил, что if word['ctag'] =='Ne' and word['rel'] == 'MOZ':
тогда это объекты-отношения, остальные — именованные объекты, например subject amp; object
.
— затем он должен перейти к следующему "PUNC"
и выполнить повторный поиск Ne
и rel
.
—> Результат, который я ожидал от каждого предложения: (e1, relation, e2)
—> (Kabul, located, Afghanistan)
Комментарии:
1. Вопрос неясен, главным образом потому, что ваш образец вывода, похоже, не соответствует вашему вводу. Определите желаемый результат так, чтобы он соответствовал вашим входным данным, и определите свои входные данные так, чтобы они охватывали все возможные случаи.
2. @Tomalak, я добавил вывод, вы можете увидеть вопрос, я полностью изменил его на английский: вывод:-
(entity1, relation1, entity2)
как(Kabul, located_in, AFG)