Печать Python в файл. Сортировка с помощью defaultdict

#python #defaultdict

#python #defaultdict

Вопрос:

У меня есть некоторый код:

 filename = "training_data.txt"
with open(filename,'r') as infile:
     d = defaultdict(lambda: defaultdict(int))
     tagRE = re.compile(r'[A-Za-z] /[A-Z] ')
     for line in infile:
         for token in tagRE.findall(line):
             word, tag = token.split("/")
             d[word][tag]  = 1

f = open('out.txt', 'w')           
for word, word_data in d.items():
    f.write(word   " "   " ".join(tag   ":"   str(freq)   'n'
    for tag, freq in word_data.items()))    
  

Обучающие данные представляют собой текст с тегом части речи, например

Сегодня / NN , /, Количество поставок на ПК / NN / NNS в год / всего в RB / VBP около / DT $ / 38,3 / CD млрд / CD по всему миру / JJ ./.

Текст, записываемый в файл, должен иметь формат: word: часть речи: частота, где, если слово имеет несколько тегов, это и частота находятся в одной строке. На данный момент перевод строки помещает теги в новую строку, если слово содержит более одного из них. Я хотел бы:

1) Поместите их в одну строку, например, означает VBP: 7 JJ: 1 NN: 2 VB: 27

2) Эти частоты должны быть напечатаны в порядке убывания. Допускает ли это моя структура данных? Я не могу понять, как бы я это сделал.

Спасибо!

Комментарии:

1. Если вы не хотите прерывания строки, зачем вам символ новой строки n

2. @PatrickHaugh Привет, Патрик. Без этого он печатает все непрерывно: main JJ: 40Lightfoot NNP: 2Mandle из-за того, как структурированы циклы for.

Ответ №1:

 tagfreq = " ".join(tag   ":"   str(freq) 
           for tag, freq in 
           sorted(word_data.items(), key=lambda x: x[1], reversed=True))
w = ''.join([word, " ",  tagfreq, 'n'])
f.write(w) 
  

Обычно используется join вместо для строк. переместил n в конец write и отсортировал items по частоте в порядке убывания.

Комментарии:

1. Отличное решение. Большое спасибо!