我的代码是计算代币。 它从文本文件中获取输入。我想从excel获取输入但是如何? 另一个问题是代码不适用于相对较大的数据。我该如何优化它?
# start
import codecs
from collections import Counter
def count_char(Input):
#Input file
fi= codecs.open('G:\python-proj/text.txt' , 'r',encoding='utf-8')
Input= fi.read()
#count words
spli=Input.split()
freq = Counter(spli)
sum=len(list(freq.elements()))
print('Total Tokenes:\n ')
print(sum)
print('\n')
count_char(Input)
答案 0 :(得分:1)
1)您可以将excel文件保存为.csv和Python的内置CSV阅读器来解析它。
2)大型数据集速度慢,因为您使用fi.read()
一次性将整个文件读入内存。你可以计算每一行的代币:
for line in fi.read():
do something with (line.split())
答案 1 :(得分:1)
Input= fi.read()
将整个文件读入内存。这就是大文件绊倒你的原因。解决方案是逐行阅读。
由于您要将单词保存在Counter
对象中,因此大文件仍然会让您失望。如果重复很少,那么该对象将变得非常大。如果重复是常见的内存将不是一个问题。
当list(someCounter.elements())
有大量计数时,无论你做什么都不打电话someCounter
。它将返回一个非常大的列表。 (如果someCounter = Counter({'redrum': 100000})
,则list(someCounter.elements())
将为您提供包含100000个元素的列表!)
char_count = 0
word_counter = Counter()
with codecs.open('G:\python-proj/text.txt' , 'r',encoding='utf-8') as f:
for line in f:
char_count += len(line)
word_counter.update(line.split())
unique_word_count = len(word_counter)
total_word_count = sum(word_counter.itervalues())
请注意,使用line.split()
可能会导致某些字词被视为唯一,您不会认为这些字词是唯一的。考虑:
>>> line = 'Red cars raced red cars.\n'
>>> Counter(line.split())
Counter({'cars': 1, 'cars.': 1, 'raced': 1, 'red': 1, 'Red': 1})
如果我们希望将'red'
和'Red'
计算在一起而不管大小写,我们可以这样做:
>>> line = 'Red cars raced red cars.\n'
>>> Counter(s.lower().split()) # everything is made lowercase before counting
Counter({'red': 2, 'cars': 1, 'cars.': 1, 'raced': 1})
如果我们希望将'cars'
和'cars.'
统计在一起而不管标点符号,我们就像这样删除标点符号:
>>> import string
>>> punct = string.punctuation
>>> line = 'Red cars raced red cars.\n'
>>> Counter(word.strip(punct) for word in line.lower().split())
Counter({'cars': 2, 'red': 2, 'raced': 1})
关于阅读Excel文件,您的问题需要更具针对性。从python-excel.org开始,选择看起来最合适的库,尝试编写一些代码,搜索StackOverflow以获取答案,然后将您遇到的任何问题作为问题发布,并将代码显示为您尝试的内容。