FreqDist с использованием NLTK - PullRequest
2 голосов
/ 09 июня 2011

Я пытаюсь получить частоту распространения набора документов, используя 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)

Ответы [ 2 ]

2 голосов
/ 09 июня 2011

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

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

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

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

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

1 голос
/ 09 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...