FreqDist с использованием NLTK

Я пытаюсь получить частотное распределение набора документов с помощью Python. Мой код по какой-то причине не работает и выдает эту ошибку:

Traceback (most recent call last):
  File "C:\Documents and Settings\aschein\Desktop\freqdist", line 32, in <module>
    fd = FreqDist(corpus_text)
  File "C:\Python26\lib\site-packages\nltk\probability.py", line 104, in __init__
    self.update(samples)
  File "C:\Python26\lib\site-packages\nltk\probability.py", line 472, in update
    self.inc(sample, count=count)
  File "C:\Python26\lib\site-packages\nltk\probability.py", line 120, in inc
    self[sample] = self.get(sample,0) + count
TypeError: unhashable type: 'list'

Вы можете помочь?

Это код до сих пор:

import os
import nltk
from nltk.probability import FreqDist


#The stop=words list
stopwords_doc = open("C:\\Documents and Settings\\aschein\\My Documents\\stopwords.txt").read()
stopwords_list = stopwords_doc.split()
stopwords = nltk.Text(stopwords_list)

corpus = []

#Directory of documents
directory = "C:\\Documents and Settings\\aschein\\My Documents\\comments"
listing = os.listdir(directory)

#Append all documents in directory into a single 'document' (list)
for doc in listing:
    doc_name = "C:\\Documents and Settings\\aschein\\My Documents\\comments\\" + doc
    input = open(doc_name).read() 
    input = input.split()
    corpus.append(input)

#Turn list into Text form for NLTK
corpus_text = nltk.Text(corpus)

#Remove stop-words
for w in corpus_text:
    if w in stopwords:
        corpus_text.remove(w)

fd = FreqDist(corpus_text)

person AJS    schedule 08.06.2011    source источник


Ответы (2)


Две мысли, которые, я надеюсь, по крайней мере, способствуют ответу.

Во-первых, в документации по методу nltk.text.Text() указано (выделено мной):

Обертка вокруг последовательности простых (строковых) токенов, предназначенная для поддержки начального изучения текстов (через интерактивную консоль). Его методы выполняют различные анализы контекстов текста (например, подсчет, согласование, обнаружение словосочетаний) и отображают результаты. Если вы хотите написать программу, использующую эти анализы, вам следует обойти класс Text и вместо этого использовать соответствующую функцию или класс анализа напрямую.

Поэтому я не уверен, что Text() - это то, как вы хотите обрабатывать эти данные. Мне кажется, вы бы отлично справились со списком.

Во-вторых, я хотел бы предупредить вас, чтобы вы подумали о расчете, который вы просите NLTK выполнить здесь. Удаление стоп-слов перед определением частотного распределения означает, что ваши частоты будут искажены; Я не понимаю, почему стоп-слова удаляются перед табулированием, а не просто игнорируются при проверке распределения постфактум. (Я полагаю, что этот второй пункт будет лучшим вопросом/комментарием, чем частью ответа, но я счел нужным указать, что пропорции будут искажены.) В зависимости от того, для чего вы собираетесь использовать частотное распределение, это может или может не быть проблемой само по себе.

person dmh    schedule 09.06.2011
comment
дмх точно прав. Нет необходимости использовать функцию text() в NLTK. Ваш массив corpus[] должен подойти для выполнения FreqDist. - person Adam_G; 20.05.2012

Ошибка говорит, что вы пытаетесь использовать список в качестве хеш-ключа. Можете ли вы преобразовать его в кортеж?

person zhizhong    schedule 08.06.2011