2015-03-29 8 views
1

Я пытаюсь прочитать текстовый файл, начертить пунктуацию, сделать все в нижнем регистре, затем напечатать общее количество слов, общее количество уникальных слов (что означает «a», например, если он находится в тексте 20 раз, будет учитываться только один раз), а затем печатать наиболее часто встречающиеся слова вместе с их частотой (то есть a: 20).Подсчет количества слов и уникальных слов из файла txt- Python

Я понимаю, что есть похожие вопросы по StackOverflow, но я новичок и пытаюсь решить эту проблему, используя минимальное количество импорта, и задавался вопросом, есть ли способ закодировать это, а не импортировать что-то вроде Collections.

У меня есть код ниже, но я не понимаю, почему я не получаю ответа, который мне нужен. Этот код печатает полноту текстового файла (с каждым словом в новой строке, и все знаки препинания удалены), то печать:

e 1 
n 1 
N 1 
o 1 

Что, я полагаю, является «None» разделилась на персонажей с их частотой , Почему мой код дает мне этот ответ и что я могу сделать, чтобы изменить его?

код ниже:

file=open("C:\\Users\\Documents\\AllSonnets.txt", "r") 


def strip_sonnets(): 
    import string 
    new_file=file.read().split() 
    for words in new_file: 
     data=words.translate(string.punctuation) 
     data=data.lower() 
     data=data.strip(".") 
     data=data.strip(",") 
     data=data.strip("?") 
     data=data.strip(";") 
     data=data.strip("!") 
     data=data.replace("'","") 
     data=data.replace('"',"") 
     data=data.strip(":") 
     print(data) 

new_file=strip_sonnets() 
new_file=str(new_file) 

count={} 
for w in new_file: 
    if w in count: 
     count[w] += 1 
    else: 
     count[w] = 1 
for word, times in count.items(): 
    print (word, times) 

ответ

0

Вы не хотите перевести, если вы хотите просто удалить знаки препинания из концов слов. collections.Counter ДИКТ также считать слова для вас:

from collections import Counter 
from string import punctuation 


with open("in.txt") as f:  
    c = Counter(word.http://stackoverflow.com/posts/29328942/editrstrip(punctuation) for line in f for word in line.lower().split()) 

# print each word and how many times it appears 
for k, freq in c.items(): 
    print(k,freq) 

Чтобы увидеть слова в порядке наиболее часто, чтобы не менее, то вы можете использовать .most_common():

for k,v in c.most_common(): 
    print(k,v) 

Без импорта использовать dict.get:

c = {} 
with open("in.txt") as f: 
    for line in f: 
     for word in line.lower().split(): 
      key = word.rstrip(punctuation) 
      c[key] = c.get(key, 0) + 1 

Далее сортировать по частоте:

from operator import itemgetter 

for k,v in sorted(c.items(),key=itemgetter(1),reverse=True): 
    print(k,v) 

Почему вы видите Нет, потому что вы установили new_file=strip_sonnets(), и ваша функция ничего не возвращает, так как со всеми функциями, которые не указывают возвращаемое значение, оно возвращает None по умолчанию.

Вы установите new_file=str(new_file) так, когда вы перебирать for w in new_file вы итерацию каждого символа в None

Вы должны возвратить данные:

def strip_sonnets(): 
    new_file=file.read().split() 
    for words in new_file: 
     data= words.translate(string.punctuation) 
     data=data.lower() 
     data=data.strip(".") 
     data=data.strip(",") 
     data=data.strip("?") 
     data=data.strip(";") 
     data=data.strip("!") 
     data=data.replace("'","") 
     data=data.replace('"',"") 
     data=data.strip(":") 
    return data # return 

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

path = "C:\\Users\\Documents\\AllSonnets.txt" 

def strip_sonnets(): 
    with open(path, "r") as f:  
     return (word.lower().rstrip(punctuation) for line in f for word in line.split()) 

.rstrip(punctuation) в основном делает то, что вы пытаетесь сделать с помощью кода, используя полосу и заменяйте повторно.

+0

еще одно интересное нижнее ноль –

+0

Могу ли я узнать, почему downvote? –

+0

@NizamMohamed, возможно, из-за вашего сброса кода. Вы не ответили на вопрос, вы просто скомпилировали код. –

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