Мой проект векторизации не работает. Как бы я go об исправлении этого - PullRequest
0 голосов
/ 03 мая 2020
class Document: 
    def __init__(self, doc_id):
        # create a new document with its ID
        self.id = doc_id
        # create an empty dictionary 
        # that will hold the term frequency (TF) counts
        self.tfs = {}

   def tokenization(self, text):
        # split a title into words, 
        # using space " " as delimiter
        words = text.lower().split(" ")
        for word in words: 
            # for each word in the list
            if word in self.tfs: 
                # if it has been counted in the TF dictionary
                # add 1 to the count
                self.tfs[word] = self.tfs[word] + 1
            else:
                # if it has not been counted, 
                # initialize its TF with 1
                self.tfs[word] = 1


    def save_dictionary(diction_data, file_path_name):
        f = open("./textfiles", "w+")

        for key in diction_data:
            # Separate the key from the frequency with a space and
            # add a newline to the end of each key value pair
            f.write(key + " " + str(diction_data[key]) + "\n")

        f.close()


    def vectorize(data_path):
        Documents = []
        for i in range(1, 21):
            file_name = "./textfiles/"+ i + ".txt"
            # create a new document with an ID
        doc = Document(i+1)
            #Read the files
        f = open(file_name)
        print(f.read())
            # compute the term frequencies
            #read in the files contents
        doc.tokenization(f.read())
            # add the documents to the lists
        Documents.append(doc)

     save_dictionary(doc.tfs, "tf_" + str(doc.id) + ".txt")

     DFS = {}
     for doc in Documents:
        for word in doc.tfs:
        DFS[word] = DFS.get(word,0) + 1

    save_dictionary(doc.DFS, "DFS_" + str(doc.id) + ".txt")


    vectorize("./textfiles")

Итак, выше приведен код, который у меня есть, и он не работает. Я добавил вложенное l oop для каждого слова в словаре документа, чтобы сделать следующее: Если оно не отображается в словаре для DF, добавьте слово в словарь DF;

Если оно уже есть словарь DF, увеличьте его значение DF, добавив к нему 1;

Затем, после обработки всех файлов, я снова вызываю функцию save_dictionary (), чтобы сохранить словарь DF в файл с именем df.txt по тому же пути. с входными текстовыми файлами. Затем векторизируйте.

Когда я запускаю код, ничего не происходит, поэтому я определенно что-то сделал не так, любая помощь будет оценена.

1 Ответ

0 голосов
/ 03 мая 2020

Как уже упоминалось в комментариях, ваш отступ в нескольких местах неверен. Пожалуйста, исправьте это в первую очередь. Например, в vectorize() ссылка i указана в назначении doc, но она находится за пределами локальной области действия для l oop, где определено i.

Кроме того, это будет полезно отделить код logi c от части скрипта для облегчения отладки.

ОБНОВЛЕНИЕ :

save_dictionary и vectorize() либо необходимо self в качестве первого параметра функции, чтобы быть частью класса Document, либо нуждаться в @staticmethod декоратор. Кроме того, i все еще упоминается за пределами для l oop, где это применимо только. Изменения в vectorize Я бы предложил исправить отступ по отношению к for l oop и использовать обозначение with для создания диспетчера контекста для правильного и простого открытия и закрытия файлов:

def vectorize(self, data_path):
    Documents = []
    for i in range(1, 21):
        file_name = "./textfiles/"+ str(i) + ".txt"
        # create a new document with an ID
        doc = Document(i+1)
        #Read the files
        with open(file_name, 'r') as f:
            text = f.read()
            # compute the term frequencies
            #read in the files contents
            doc.tokenization(text)
            # add the documents to the lists
        Documents.append(doc)

Диспетчер контекста автоматически закрывает файл при выходе из with context / indentation.

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