KeyError, когда ключ существует в словаре

Я работаю над кодом, который определяет язык твита и применяет лексическое соответствие этому языку. Код USED работал нормально, он сделал свою работу. Затем он выдал KeyError: 'en', хотя в словаре существует 'en'. Я просмотрел несколько вопросов, на которые уже есть ответы, и, похоже, в них ничего не работает. Я предоставлю часть кода, относящуюся только к немецкому языку (без учета других языков). Код записывается туда, где, если обнаруженный язык отсутствует в словаре, он автоматически классифицируется как английский.

from langdetect import detect
import glob
import re

rsc_lg = {
      "de" : {"pos" : "ressources/positive_words_de.txt",
              "neg" : "ressources/negative_words_de.txt"},
      "en" : {"pos" : "ressources/positive_words_en.txt",
              "neg" : "ressources/negative_words_en.txt"}
      }
dic = {}
liste_resultats = []
for path in glob.glob("corpus/*/*/*"):
  f = open(path, errors="ignore")
  read = f.read().lower()
  lang = detect(read)
  if lang not in dic:
    dic[lang] = {} 

  if lang not in rsc_lg :
    lang = "en"

###german###
  f_de_pos = open(rsc_lg[lang]["pos"])
  f_de_neg = open(rsc_lg[lang]["neg"])
  de_pos = f_de_pos.read().lower().split()
  de_neg = f_de_neg.read().lower().split()
  f_de_pos.close()
  f_de_neg.close()

  words = read.split()
  pos_words_de = set(words) & set(de_pos)
  neg_words_de = set(words) & set(de_neg)

  if len(pos_words_de) > len(neg_words_de):
      diagnostic = "positive"
  if len(pos_words_de) == len(neg_words_de):
      diagnostic = "mixed"
  if len(pos_words_de) < len(neg_words_de):
      diagnostic = "negative"
#  print("this german tweet is ", diagnostic)
  dic[lang][path] = diagnostic


  corpus, lang, classe, nom = re.split("\\\\", path)
  liste_resultats.append([nom, lang, classe, diagnostic])

import json
w = open("resultats_langdetect_german.json", "w")
w.write(json.dumps(liste_resultats, indent= 2))
w.close()

f.close()

print("done")

Ошибка возникает со строкой dic[lang][path] = diagnostic сразу после классификации твитов как положительных, смешанных или отрицательных. Как я уже сказал, раньше это работало нормально и внезапно перестало работать, несмотря на то, что я не вносил абсолютно никаких изменений в код.


person Arie G.    schedule 20.05.2020    source источник
comment
вы отлаживали этот код? в какой строке вылетела ошибка?   -  person Caique C Pereira    schedule 20.05.2020
comment
Ты заставляешь нас гадать, где ошибка. Пожалуйста, обновите вопрос, чтобы включить полное сообщение об ошибке.   -  person John Gordon    schedule 20.05.2020
comment
Ой, извини! Я добавил, где возникает ошибка   -  person Arie G.    schedule 20.05.2020


Ответы (1)


Проблема в том, что если вы сталкиваетесь с неизвестным языком, вы выполняете dic[lang] = {} и сразу после этого делаете lang = "en". Теперь, если lang было, например, "es", вы получите dic == {"es": {}} и lang == "en". Позже в коде вы делаете dic[lang][path] = diagnostic, но в этот момент "en" not in dic, так как он все еще использует код неизвестного языка ("es"). Вероятно, вы захотите поменять порядок двух операторов, т. е. сначала установить lang = "en", а затем выполнить dic[lang] = {}.

person a_guest    schedule 20.05.2020
comment
Спасибо, я даже не подумал об этом. Странно, что раньше он работал нормально и вдруг понял, что произошла ошибка! - person Arie G.; 20.05.2020
comment
@АрьеГ. Вероятно, это связано с тем, что вы запустили код с некоторыми новыми данными, которые были обнаружены как язык, не включенный в ваши ресурсы. Вот как он может изменить поведение без изменения самого кода, он зависит от входных данных. - person a_guest; 20.05.2020