Давайте сначала попробуем скопировать вашу таблицу с печально известной BookCorpus со структурой каталогов:
/books_in_sentences
books_large_p1.txt
books_large_p2.txt
В коде:
from nltk.corpus import PlaintextCorpusReader
from nltk import ConditionalFreqDist
from nltk import word_tokenize
from collections import Counter
import pandas as pd
corpus = PlaintextCorpusReader('books_in_sentences/', '.*')
cfd_appr = ConditionalFreqDist(
(textname, num_appr)
for textname in corpus.fileids()
for num_appr in [len(w) for w in
word_tokenize(corpus.raw(fileids=textname))])
Затем pandas munging part:
# Idiom to convert a FreqDist / ConditionalFreqDist into pd.DataFrame.
df = pd.DataFrame([dict(Counter(freqdist))
for freqdist in cfd_appr.values()],
index=cfd_appr.keys())
# Fill in the not-applicable with zeros.
df = df.fillna(0).astype(int)
# If necessary, sort order of columns and add accordingly.
df = df.sort_values(list(df))
# Sum all columns per row -> pd.Series
counts_per_row = df.sum(axis=1)
Наконец, для доступа к индексированной серии, например:
print('books_large_p1.txt', counts_per_row['books_large_p1.txt'])
В качестве альтернативы
Я бы рекомендовал вышеуказанное решение, чтобы вы можете работать с DataFrame для дальнейшей обработки чисел, но если все, что вам нужно, это просто количество столбцов в строке, то попробуйте следующее.
Если необходимо избежать pandas и использовать значения в CFD напрямую, тогда вам придется использовать ConditionalFreqDist.values()
и тщательно его перебирать.
Если мы сделаем:
>>> list(cfd_appr.values())
[FreqDist({3: 6, 6: 5, 1: 5, 9: 4, 4: 4, 2: 3, 8: 2, 10: 2, 7: 1, 14: 1}),
FreqDist({4: 10, 3: 9, 1: 5, 7: 4, 2: 4, 5: 3, 6: 3, 11: 1, 9: 1})]
Мы увидим список FreqDist, каждый из которых соответствует ключам (в данном случае имена файлов):
>>> list(cfd_appr.keys())
['books_large_p1.txt', 'books_large_p2.txt']
Поскольку мы знаем, что FreqDist является подклассом коллекций. Объект-основатель , если мы суммируем значения каждого объекта Counter, мы получим:
>>> [sum(fd.values()) for fd in cfd_appr.values()]
[33, 40]
, который выводит те же значения, что и df.sum(axis=1)
выше.
Итак, чтобы собрать это вместе:
>>> dict(zip(cfd_appr.keys(), [sum(fd.values()) for fd in cfd_appr.values()]))
{'books_large_p1.txt': 33, 'books_large_p2.txt': 40}