Запись результатов NLTK FreqDist в файл .csv в виде строки в Python

#python #python-3.x #csv #nltk #export-to-csv

#python #python-3.x #csv-файл #nltk #экспорт в csv #csv

Вопрос:

Я пытаюсь записать результаты подсчета частоты определенных слов в текстовом файле на основе набора слов в списке python (я не включил его в список кода, поскольку их несколько сотен)

 file_path = 'D:/TestHedges/Hedges_Test_11.csv'
corpus_root = test_path
wordlists = PlaintextCorpusReader(corpus_root, '.*')
print(wordlists.fileids())
CIK_List = []
freq_out = []

for filename in glob.glob(os.path.join(test_path, '*.txt')):

 CIK = filename[33:39]
 CIK = CIK.strip('_')
 # CIK = CIK.strip('_0') commented out to see if it deals with just removing _.  It does not 13/9/2020



 newstext = wordlists.words()
 fdist = nltk.FreqDist([w.lower() for w in newstext])

 CIK_List.append(CIK)
 with open(file_path, 'w', newline='') as csv_file:
  writer = csv.writer(csv_file)
  writer.writerow(["CIK"]   word_list)
  for val in CIK_List:
   writer.writerow([val])
  for m in word_list:
     print(CIK, [fdist[m]], end='')
     writer.writerows([fdist[m]])
  

Моя проблема связана с записью fdist[m] в виде строки в файл .csv. Это порождает ошибку

 _csv.Error: iterable expected, not int
  

Как я могу переписать это, чтобы поместить частотное распределение в строку в файле .csv?

Заранее спасибо

Ответ №1:

У вас есть два варианта — либо использовать writerow вместо writerows , либо сначала создать список значений, а затем передать его writer.writerows вместо fdist[m] . Теперь каждое из значений строки в списке должно быть кортежем (или interable). Поэтому для writerows работы вам придется снова инкапсулировать его в кортеж:

  writer.writerows([(fdist[m],)])
  

Здесь запятая обозначает кортеж из 1 значения.

Чтобы записать все значения в одну строку вместо этого кода:

 for m in word_list:
     print(CIK, [fdist[m]], end='')
     writer.writerows([fdist[m]])
  

Вы должны использовать:

 for m in word_list:
     print(CIK, [fdist[m]], end='')
writer.writerows(([fdist[m] for m in word_list],))
  

Пожалуйста, обратите внимание на понимание списка.

С другой стороны, просто взглянув на ваш код, мне кажется, что вы могли бы сделать то же самое без привлечения NLTK библиотеки, просто используя collections.Counter из стандартной библиотеки. Это базовый контейнер в FreqDist классе.

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

1. Он записывает правильные значения, но в отдельных строках (в столбце). Что мне нужно, так это записать подсчеты в одну строку, но отдельные ячейки в файле .csv. Для этого я использую NLTK, поскольку позже мы будем больше использовать его для вычислений TF-IDF. Кроме того, этот код создаст корпус текстовых файлов, где мне действительно нужно подсчитать количество слов, встречающихся в каждом текстовом файле в каталоге.

2. Я объединяю номер CIK с FreqDist в файл следующим образом « для val в CIK_List: writer.writerows(([val] [f_dist [m] для m в word_list],))« но это только запись частотного распределения для последнего файла в спискекаталог. Это проблема с отступом в python или есть какая-то другая причина?