#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. Отличное решение. Большое спасибо!