【发布时间】:2017-12-03 09:12:49
【问题描述】:
由于 PDF 到 txt 的转换错误,我正在对文本进行文本分析,有时会将单词混在一起。所以我不想匹配单词,而是匹配字符串。
例如,我有字符串:
mystring='The lossof our income made us go into debt but this is not too bad as we like some debts.'
然后我搜索
key_words=['loss', 'debt', 'debts', 'elephant']
输出的格式应该是:
Filename Debt Debts Loss Elephant
mystring 2 1 1 0
我的代码运行良好,除了一些小故障:1)它不报告零频率词的频率(所以“大象”不会出现在输出中:2)key_words 中的单词顺序似乎很重要(即,我有时会为“债务”和“债务”分别计算 1 个计数,有时它只报告 2 个“债务”计数,而“未报告债务”。如果我能做到,我可以接受第二点将变量名称“打印”到数据集......但不确定如何。
下面是相关代码。谢谢! PS。不用说,它不是最优雅的一段代码,但我正在慢慢学习。
bad=set(['debts', 'debt'])
csvfile=open("freq_10k_test.csv", "w", newline='', encoding='cp850', errors='replace')
writer=csv.writer(csvfile)
for filename in glob.glob('*.txt'):
with open(filename, encoding='utf-8', errors='ignore') as f:
file_name=[]
file_name.append(filename)
new_review=[f.read()]
freq_all=[]
rev=[]
from collections import Counter
for review in new_review:
review_processed=review.lower()
for p in list(punctuation):
review_processed=review_processed.replace(p,'')
pattern = re.compile("|".join(bad), flags = re.IGNORECASE)
freq_iter=collections.Counter(pattern.findall(review_processed))
frequency=[value for (key,value) in sorted(freq_iter.items())]
freq_all.append(frequency)
freq=[v for v in freq_all]
fulldata = [ [file_name[i]] + freq for i, freq in enumerate(freq)]
writer=csv.writer(open("freq_10k_test.csv",'a',newline='', encoding='cp850', errors='replace'))
writer.writerows(fulldata)
csvfile.flush()
【问题讨论】:
-
我可以指出“Python 3.5 - 获取计数器以报告零频率项目”具有误导性,因为 python 在它的集合中有一个 Counter 并且这个问题与它无关。(参见例如我的回答) 一个更好的问题标题将是例如“Python 3 - 计算子串集的出现次数 - 具有重叠的子串”
-
要让计数器报告零频率项目(将我带到这里),您需要使用零频率项目对其进行初始化,例如Counter({x:0 for x in list})
标签: python counter word-frequency