#python #json
Вопрос:
сначала я новичок в python, но я уже работал на других языках программирования (в основном на C , PHP и Java). Мне трудно заставить python делать то, что я хочу: создать правильную строку json. Моя проблема заключается не в создании строки json сама по себе, а в содержимом. Позвольте мне объяснить, что у меня есть этот код:
import spacy
...
def eng_pos(textstr):
x = english() #A class which i developed to get the infinitive form of each verb
data = {}
nlp = spacy.load("en_core_web_trf")
doc = nlp(textstr)
for token in doc:
data[token.text] = token.pos_
if token.pos_ == "VERB":
data['Tense']=token.morph.get("Tense")
data['Infinitive'] = x.infinitive(token.text)
print(token.text " " token.pos_)
json_data = json.dumps(data)
print(json_data)
return json_data
что, по сути, создает данные json из словаря, содержащего часть речи(pos) каждого слова, и для каждого глагола это дает мне форму времени и инфинитива. Он также печатает каждый токен и его pos. Как только это будет сделано, он выгружает все в строку json и печатает ее на экране, а затем возвращает. Пока никаких проблем, так как это дает мне действительный json, но без правильного содержимого:
Для получения дополнительной информации я использовал эти предложения в качестве textstr в качестве примера:
«ПРЕДСТАВЬТЕ, ЕСЛИ хотите, игрушечную лодку, которая может поместиться у вас на ладони. В середине корабля добавьте приземистую катушку швейной нити,лежащую на боку. Увеличьте это примерно в тысячу раз, и в результате получится 150-метровый Nexans Aurora. Рассматриваемая нить представляет собой километры высоковольтной линии электропередачи, готовой к развертыванию в кормовой части судна по морскому дну».
что дает мне этот json:
{"IMAGINE": "VERB", "Tense": ["Past"], "Infinitive": "deploy", ",": "PUNCT", "IF": "SCONJ", "YOU": "PRON", "will": "AUX", "a": "DET", "toy": "NOUN", "boat": "NOUN", "that": "SCONJ", "might": "AUX", "fit": "VERB", "in": "ADP", "the": "DET", "palm": "NOUN", "of": "ADP", "your": "PRON", "hand": "NOUN", ".": "PUNCT", "At": "ADP", "mid": "NOUN", "-": "PUNCT", "ship": "NOUN", "add": "VERB", "squat": "ADJ", "spool": "NOUN", "sewing": "NOUN", "thread": "NOUN", "lying": "VERB", "on": "ADP", "its": "PRON", "side": "NOUN", "Scale": "VERB", "up": "ADP", "about": "ADP", "thousand": "ADV", "fold": "ADV", "and": "CCONJ", "result": "NOUN", "is": "AUX", "150": "NUM", "metre": "NOUN", "long": "ADJ", "Nexans": "PROPN", "Aurora": "PROPN", "The": "DET", "question": "NOUN", "kilometres": "NOUN", "high": "ADJ", "voltage": "NOUN", "power": "NOUN", "line": "NOUN", "ready": "ADJ", "to": "PART", "be": "AUX", "deployed": "VERB", "from": "ADP", "aft": "NOUN", "across": "ADP", "sea": "NOUN", "floor": "NOUN"}
если вы внимательно посмотрите строку json, вы заметите, что только время и форма инфинитива даны только для последнего глагола «развернуто» в последнем предложении абзаца. (и не для каждого глагола в этом коротком абзаце, как я этого хочу). Почему? Это мой вопрос. Почему учитывается только последний глагол, а остальные глаголы игнорируются? Я думаю, что это как-то связано с моим кодом python, так как все остальное правильно. Я застрял уже два дня и не вижу, в чем проблема, так что, если вы можете мне помочь, пожалуйста.
Комментарии:
1. На каждой итерации вы перезаписываете предыдущие значения для ключей
Tense
иInfinitive
когда токенVERB
. Покажите, каким будет ожидаемый результат.
Ответ №1:
Это происходит потому , что вы пишете в словарь, используя ключ Tense
Infinitive
, и каждый раз, когда вы это делаете, данные переопределяются.
Скорее всего, вы захотите сохранить вложенный диктант, в котором есть не только pos_
«и», но Tens
и Infinitive
«и».:
data[token.text] = {"pos": token.pos_}
if token.pos_ == "VERB":
data[token.text]['Tense']=token.morph.get("Tense")
data[token.text]['Infinitive'] = x.infinitive(token.text)
Это приведет к чему-то вроде этого:
{
...
"deployed": {
"pos_": "VERB",
"Tense": ["PAST"],
"Infinitive": "deploy"
},
"floor": {
"pos_": "NOUN"
}
...
}
Однако имейте в виду, что это все равно переопределит данные для повторяющихся слов. Однако, поскольку результат всегда должен быть одинаковым для одного и того же слова, это, вероятно, нормально.
Комментарии:
1. Спасибо тебе, титус, что ты спас мне жизнь, я целых два дня мучился только этой проблемой. Ты мой герой!