2016-03-22 2 views
-1

Я довольно новичок в Python, и я искал ответы на эту ошибку, но я недостаточно опыт, чтобы точно видеть, где я ошибаюсь - вероятно, что-то действительно основное.
Я работаю над проектом, чтобы идентифицировать авторов на основе слов, которые они используют в своих текстах. Я добавляю слова в словарь для каждого автора, со словом в качестве ключа, а значение - это количество раз, когда слово встречается в текстах этого автора. Я также создаю словарь всех слов всех авторов и использую их для вычисления вероятностей. Это работает отлично, изначально.
. Моя проблема возникает, когда я добавляю в k-fold cross validation, которую я использую, поскольку мой корпус не особо большой. Я перебираю список имен авторов, который соответствует имени, которое я присвоил их пустому словарю. Как только я извлечу нужные файлы, я хочу добавить очищенный/проанализированный текст в словарь, но я получаю вышеуказанную ошибку, которая ссылается на строку author [word] = 1 в моем словаре fn, что я вызовите вторую вторую строку кода ниже. Из моего чтения других ответов, это сделать, чтобы str была неизменной, но я просто не вижу, как применить ответы на мою проблему. ваша помощь очень ценится! Ps Я знаю, что есть библиотеки и т. Д., Которые могут выполнять всю эту работу, но вся идея проекта состоит в том, чтобы построить мою собственную модель и сравнить ее с другими моделями.Ошибка Python: объект 'str' не поддерживает назначение объектов

path = "C:\\......\The Letters\\" 

#create an empty vocab set 
vocab = set() 
stop = stopwords.words('english') 

snowball = SnowballStemmer('english') 

#create empty dictionary for each author 
AuthorA = {} 
AuthorB = {} 
AuthorC = {} 

authorList = ["AuthorA","AuthorB","Authorc"] 

#function to preprocess the words. Opens & reads file, removes non alphabet 
#characters, converts to lowercase, and tokenizes 
def cleanText(path,author,eachfile):  
    f= open(path+author+"\\"+eachfile, "r")   
    contents = f.read() 
    strip = re.sub('[^a-zA-Z]',' ',contents) 
    lowerCase = strip.lower()  
    allwords = lowerCase.split()  
    return allwords 

#function to add words to the vocabulary set 
def createVocab(allwords):  
    for word in allwords: 
     if len(word)>= 4: 
      vocab.update(allwords) 
    return 

#function to add words to author dictionary and count occurrences of each word  
def dictionary(allwords, author): 
    for word in allwords: 
     if len(word)>= 4: 
      if word in author: 
       author[word]= author[word]+1 
      else: 
       author[word]= 1 
    return 


def main(): 
    global authorList 
    global path 
    global vocab 
    global AuthorA 
    global AuthorB 
    global AuthorC 

    for author in authorList: 
#filename and path 
     listing = os.listdir(path+author) 

#specify parameters for k fold validation 
     #split into 10 folds and take a file form each fold 
     #repeat for until the entire directory has been split 
     folds = 10 
     subset_size = len(path+author)/folds 
     for i in range(folds): 
      #use these files to train the model 
      current_train = listing[:i*subset_size:]+listing[(i+1)*subset_size:] 
      #use these files to test the model 
      current_test = listing[i*subset_size:][:subset_size] 

    #iterate through the files selected by current_train variable 
       for eachfile in current_train: 
    #call function to parse text   
        allwords = cleanText(path,author,eachfile)     
    #call fn to add words to dictionary 
        dictionary(allwords, author)     
    #call fn to add words to vocab 
        createVocab(allwords) 
+0

На какой линии вы получаете сообщение об ошибке? –

+2

Пожалуйста, ознакомьтесь с [Как задать хороший вопрос?] (Http://stackoverflow.com/help/how-to-ask) и [Как создать минимальный, полный и проверенный пример] (http: //stackoverflow.com/help/mcve). Вопрос, как заявлено сейчас, слишком широк для стандартов SO. Кроме того, позаботьтесь об углублении. В Python отступ является частью синтаксиса, а в вашем коде он выглядит подозрительно. –

+0

ошибка, когда я вызываю функцию словаря на второй последней строке и ссылается на else: author [word] = 1. Я думаю, что D.Cam ответил, мне просто нужно выяснить коллекции сейчас! – magsw

ответ

1

Вы передаете в свою функцию словаря строку для автора переменных. Верхний цикл for, for author in authorList: выполняет итерацию по списку строк, а не коллекции dict. authorList = ["AuthorA","AuthorB","Authorc"]

Вы хотите передать библиотеку dict в свою функцию. Надеюсь, это поможет!

+0

спасибо, я дам это. Мне просто нужно выяснить, как использовать коллекцию dict! – magsw

+0

У вас в значительной степени правильное использование. Вместо использования списка вы всегда можете использовать dict. 'authors = {« AuthorA »: AuthorA,« AuthorB »: AuthorB,« AuthorC »: AuthorC}', а затем вы можете перебирать их, используя 'для автора, author_dict в authors.iteritems()' –

+0

да, это в значительной степени то, что В конце концов я понял. Я создал вложенный словарь, чтобы я мог хранить слова для каждого автора, и я выполняю итерацию по клавишам. Спасибо за вашу помощь! – magsw

Смежные вопросы