Возьмите токены из текстового файла, вычислите их частоту и верните их в новом текстовом файле в формате Python. - PullRequest
0 голосов
/ 17 июня 2020

После долгих исследований и опросов друзей, я все еще остаюсь тупицей и не знаю, как решить эту проблему.

Итак, для домашнего задания мы должны определить функцию, которая обращается к двум файлов, первый из которых представляет собой текстовый файл со следующим предложением, из которого мы должны вычислить частоты слов:

В Берлине, разделенном Берлинской стеной, два ангела, Дамиэль и Кассиэль, наблюдайте за городом, невидимым и неслышным для его жителей.

Мы также должны включить запятые и точки: каждый отдельный элемент уже отмечен (отдельные элементы окружены пробелами, включая запятые и точки ). Затем частоты слов должны быть введены в новый текстовый файл как «word: count» и в том порядке, в котором они появляются, то есть:

In: 1
a: 1
Берлин: 2
разделено: 1

et c.

Я пробовал следующее:

def find_token_frequency(x, y):
    with open(x, encoding='utf-8') as fobj_1:
        with open(y, 'w', encoding='utf-8') as fobj_2:
            fobj_1list = fobj_1.split()
            unique_string = []
            for i in fobj_1list:
                if i not in unique_string:
                    unique_string.append(i)
            for i in range(0, len(unique_string)):
                fobj_2.write("{}: {}".format(unique_string[i], fobj_1list.count(unique_string[i])))

Я не уверен, что мне вообще нужно использовать .split(), но я не знаю, что еще делать, и он все равно не работает, так как он говорит мне, что я не могу разделить этот объект.

Мне сказали :

Traceback (most recent call last):
[...]

fobj_1list = fobj_1.split()

AttributeError: '_io.TextIOWrapper' object has no attribute 'split'

Когда я удаляю .split (), отображается ошибка:

fobj_2.write("{}: {}".format(unique_string[i], fobj_1list.count(unique_string[i])))

AttributeError: '_io.TextIOWrapper' object has no attribute 'count'

Ответы [ 3 ]

2 голосов
/ 17 июня 2020

Давайте разделим вашу проблему на более мелкие, чтобы нам было легче ее решить. Сначала нам нужно прочитать файл, поэтому давайте сделаем это и сохраним его в переменной:

with open("myfile.txt") as fobj_1:
    sentences = fobj_1.read()

Хорошо, теперь у нас есть ваш файл в виде строки, хранящейся в предложениях. Давайте превратим его в список и посчитаем появление каждого слова:

words = sentence.split(" ")
frequency = {word:words.count(word) for word in set(words)}

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

with open("results.txt", 'w') as fobj_2:
    for word in frequency: fobj_2.write(f"{word}:{frequency[word]}\n")

Здесь мы используем строки f для форматирования каждой строки в желаемый результат. Обратите внимание, что f-струны доступны для python3 .6 +.

1 голос
/ 17 июня 2020

Я не могу комментировать, поскольку у меня нет требуемой репутации, но причина, по которой split() не работает, заключается в том, что вы вызываете его в самом файловом объекте, а не в строке. Попробуйте вместо этого позвонить:

fobj_1list = fobj_1.readline().split()

. Кроме того, когда я запустил это локально, я получил сообщение об ошибке TypeError: 'encoding' is an invalid keyword argument for this function. Вы можете удалить аргумент кодировки из вызовов функций.

Думаю, этого должно быть достаточно, чтобы вы начали.

0 голосов
/ 17 июня 2020

Следующий сценарий должен делать то, что вы хотите.

#!/usr/local/bin/python3


def find_token_frequency(inputFileName, outputFileName):

    # wordOrderList to maintain order
    # dict to keep track of count
    wordOrderList = []
    wordCountDict = dict()

    # read the file 
    inputFile = open(inputFileName, encoding='utf-8')
    lines = inputFile.readlines()
    inputFile.close()

    # iterate over all lines in the file
    for line in lines:
        # and split them into words
        words = line.split()

        # now, iterate over all words
        for word in words:
            # and add them to the list and dict
            if word not in wordOrderList:
                wordOrderList.append(word)
                wordCountDict[word] = 1
            else:
                # or increment their count
                wordCountDict[word] = wordCountDict[word] +1


    # store result in outputFile
    outputFile = open(outputFileName, 'w', encoding='utf-8') 
    for index in range(0, len(wordOrderList)):
        word = wordOrderList[index]
        outputFile.write(f'{word}:{wordCountDict[word]}\n')

    outputFile.close()

find_token_frequency("input.txt", "output.txt")

Я немного изменил имена ваших переменных, чтобы сделать код более читабельным.

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