2017-02-17 7 views
0

私のコードは、トークンを数えることです。 テキストファイルから入力を受け取ります。私はExcelからの入力を取るが、どのようにしたいですか? もう1つの問題は、コードが比較的大きなデータに対して機能しないことです。どのように最適化するのですか?どのようにデータを読み取って、Pythonでコードを最適化するのですか

# 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

Excelファイルを読むことに関して、あなたの質問はよりターゲットを絞り込む必要があります。 Python-excel.orgで始まり、最も適切と思われるライブラリを選んで、コードを書いてStackOverflowで答えを探して、あなたが試みたことを示すコードとともに質問として出てくる問題を投稿してください。ヘルプセンターの[良い質問をどうやって行うか](http://stackoverflow.com/help/how-to-ask)を参照してください。私は以下のあなたの質問の他の部分に答えました。 –

答えて

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ファイルの読み取りについては、 nをよりターゲットとする必要があります。 python-excel.orgから始まり、最も適切と思われるライブラリを選んで、コードを書いてStackOverflowで回答を探してから、あなたが試みたことを示すコードとともに質問として遭遇する問題を投稿してください。

+0

ありがとうございました – kossaaar

+0

重複トークンを数えたくないのでカウンターを使います。私はpythonでbigennerです。 – kossaaar

+0

オハイオウは正しいです。何が言いたいのか理解した。 – kossaaar

1

1)あなたは.CSVとしてExcelファイルを保存して、PythonのCSVリーダー内蔵のそれを解析することができます。

2)ファイル全体を一度にメモリに読み込むため、大きなデータセットでは遅くなります(fi.read())。あなたは、各ライン上のトークンを数えることができる:

for line in fi.read(): do something with (line.split())

+0

ありがとうございました – kossaaar

関連する問題