我正在对由于PDF到txt转换错误,某些时候合并在一起的文本进行文本分析。所以,我想匹配字符串,而不是匹配单词。Python 3.5 - 获取计数器报告零频率项目
例如,我有字符串:
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)它没有报告零频词的频率(所以'大象'不会出现在输出t: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()
但是,在计数器中使用零值时要小心。如果你使用计数器进行一些算术运算,那么[键和值可以默默丢失](https://stackoverflow.com/q/21887125/674039)。 – wim
谢谢。我必须通读完整的清单,看看我是否保留单数/复数。为了我自己的利益,为什么Counter没有发现列表中所有字符串的出现,但只保持最短(即“债务”与“债务”)? –
谢谢@wim,很高兴知道。 –