我正在對由於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,很高興知道。 –