Определение предложения из файла JSON и извлечение связанных объектов

#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)