Wordの頻度をカウントするようにプロジェクトを高速化しようとしています。 360以上のテキストファイルがあり、単語の総数と、別の単語リストから各単語が表示される回数を取得する必要があります。単一のテキストファイルでこれを行う方法を知っています。
>>> import nltk
>>> import os
>>> os.chdir("C:\Users\Cameron\Desktop\PDF-to-txt")
>>> filename="1976.03.txt"
>>> textfile=open(filename,"r")
>>> inputString=textfile.read()
>>> Word_list=re.split('\s+',file(filename).read().lower())
>>> print 'Words in text:', len(Word_list)
#spits out number of words in the textfile
>>> Word_list.count('inflation')
#spits out number of times 'inflation' occurs in the textfile
>>>Word_list.count('jobs')
>>>Word_list.count('output')
「インフレ」、「ジョブ」、「アウトプット」の頻度を得るのは面倒です。これらの単語をリストに入れて、リスト内のすべての単語の頻度を同時に見つけることはできますか?基本的に this Pythonで。
例:これの代わりに:
>>> Word_list.count('inflation')
3
>>> Word_list.count('jobs')
5
>>> Word_list.count('output')
1
私はこれをしたいです(これは実際のコードではないことを知っています、これは私が助けを求めているものです):
>>> list1='inflation', 'jobs', 'output'
>>>Word_list.count(list1)
'inflation', 'jobs', 'output'
3, 5, 1
私の単語リストは10〜20語になるので、Pythonを単語リストに向けてカウントを取得できるようにする必要があります。また、出力は、単語を列、頻度を行として、Excelスプレッドシートにコピーして貼り付けることができました。
例:
inflation, jobs, output
3, 5, 1
そして最後に、誰もがすべてのテキストファイルに対してこれを自動化するのを手伝ってくれる? Python=フォルダに向けると、360以上のテキストファイルごとに新しいリストから上記のWordカウントを実行できます。簡単なようですが、少し行き詰まっています。 。何か助けは?
このような出力は素晴らしいでしょう:Filename1インフレ、ジョブ、出力3、5、1
Filename2
inflation, jobs, output
7, 2, 4
Filename3
inflation, jobs, output
9, 3, 5
ありがとう!
collections.Counter() 私はあなたの問題を理解していればこれをカバーしています。
ドキュメントの例はあなたの問題に一致するようです。
# Tally occurrences of words in a list
cnt = Counter()
for Word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
cnt[Word] += 1
print cnt
# Find the ten most common words in Hamlet
import re
words = re.findall('\w+', open('hamlet.txt').read().lower())
Counter(words).most_common(10)
上記の例から、次のことができるはずです。
import re
import collections
words = re.findall('\w+', open('1976.03.txt').read().lower())
print collections.Counter(words)
[〜#〜] edit [〜#〜]一方向を示す素朴なアプローチ。
wanted = "fish chips steak"
cnt = Counter()
words = re.findall('\w+', open('1976.03.txt').read().lower())
for Word in words:
if Word in wanted:
cnt[Word] += 1
print cnt
1つの可能な実装(Counterを使用)...
出力を印刷する代わりに、csvファイルに書き込んでExcelにインポートする方が簡単だと思います。 http://docs.python.org/2/library/csv.html を見て、print_summary
を置き換えます。
import os
from collections import Counter
import glob
def Word_frequency(fileobj, words):
"""Build a Counter of specified words in fileobj"""
# initialise the counter to 0 for each Word
ct = Counter(dict((w, 0) for w in words))
file_words = (Word for line in fileobj for Word in line.split())
filtered_words = (Word for Word in file_words if Word in words)
return Counter(filtered_words)
def count_words_in_dir(dirpath, words, action=None):
"""For each .txt file in a dir, count the specified words"""
for filepath in glob.iglob(os.path.join(dirpath, '*.txt')):
with open(filepath) as f:
ct = Word_frequency(f, words)
if action:
action(filepath, ct)
def print_summary(filepath, ct):
words = sorted(ct.keys())
counts = [str(ct[k]) for k in words]
print('{0}\n{1}\n{2}\n\n'.format(
filepath,
', '.join(words),
', '.join(counts)))
words = set(['inflation', 'jobs', 'output'])
count_words_in_dir('./', words, action=print_summary)
テキストファイル内のWordの頻度をカウントする単純な関数コード:
{
import string
def process_file(filename):
hist = dict()
f = open(filename,'rb')
for line in f:
process_line(line,hist)
return hist
def process_line(line,hist):
line = line.replace('-','.')
for Word in line.split():
Word = Word.strip(string.punctuation + string.whitespace)
Word.lower()
hist[Word] = hist.get(Word,0)+1
hist = process_file(filename)
print hist
}