norvig.com/big.txt से को देखते हुए, लक्ष्य बड़े पैमाने पर गिनती को गिनना है (कल्पना कीजिए कि मुझे यह गणना 100,000 बार दोहराना है)।बिग्राम को वास्तविक तेज़ी से (मल्टीप्रोसेसिंग के साथ या बिना) की गणना करना - पायथन
Fast/Optimize N-gram implementations in python के अनुसार, इस तरह Bigrams निकालने सबसे इष्टतम होगा:
_bigrams = zip(*[text[i:] for i in range(2)])
और अगर मैं Python3
उपयोग कर रहा हूँ, जनरेटर का मूल्यांकन नहीं किया जाएगा जब तक मैं list(_bigrams)
या कुछ अन्य कार्यों के साथ यह अमल में लाना वह वही करेगा।
import io
from collections import Counter
import time
with io.open('big.txt', 'r', encoding='utf8') as fin:
text = fin.read().lower().replace(u' ', u"\uE000")
while True:
_bigrams = zip(*[text[i:] for i in range(2)])
start = time.time()
top100 = Counter(_bigrams).most_common(100)
# Do some manipulation to text and repeat the counting.
text = manipulate(text, top100)
लेकिन प्रति पुनरावृत्ति के लगभग 1+ सेकंड लगते हैं, और 100,000 पुनरावृत्तियों बहुत लंबे होंगे।
मैंने sklearn
काउंटर वेक्टरोरिज़र भी कोशिश की है, लेकिन निकालने का समय, गिनने और शीर्ष 100 bigrams प्राप्त करने के लिए देशी पायथन के बराबर हैं।
तो मैं कुछ multiprocessing
के साथ प्रयोग किया गया है, Python multiprocessing and a shared counter और http://eli.thegreenplace.net/2012/01/04/shared-counter-with-pythons-multiprocessing से मामूली संशोधन का उपयोग करते हुए:
from multiprocessing import Process, Manager, Lock
import time
class MultiProcCounter(object):
def __init__(self):
self.dictionary = Manager().dict()
self.lock = Lock()
def increment(self, item):
with self.lock:
self.dictionary[item] = self.dictionary.get(item, 0) + 1
def func(counter, item):
counter.increment(item)
def multiproc_count(inputs):
counter = MultiProcCounter()
procs = [Process(target=func, args=(counter,_in)) for _in in inputs]
for p in procs: p.start()
for p in procs: p.join()
return counter.dictionary
inputs = [1,1,1,1,2,2,3,4,4,5,2,2,3,1,2]
print (multiproc_count(inputs))
लेकिन बाइग्राम गिनती में MultiProcCounter
का उपयोग कर भी लंबे समय तक यात्रा प्रति 1+ सेकंड से ले जाता है। मुझे नहीं पता कि यह मामला क्यों है, int
उदाहरण की डमी सूची का उपयोग करते हुए, multiproc_count
पूरी तरह से काम करता है।
मैं कोशिश की है:
import io
from collections import Counter
import time
with io.open('big.txt', 'r', encoding='utf8') as fin:
text = fin.read().lower().replace(u' ', u"\uE000")
while True:
_bigrams = zip(*[text[i:] for i in range(2)])
start = time.time()
top100 = Counter(multiproc_count(_bigrams)).most_common(100)
वहाँ पायथन में वास्तव में तेजी से Bigrams गिनती करने के लिए कोई तरीका है?
लगता है जैसे आपको वितरित प्रसंस्करण और मानचित्र/कम करना चाहिए यदि आप वास्तव में 100,000 बार एक ही काम करने से नहीं बच सकते हैं। मुझे लगता है कि आपका मतलब है कि आपके पास डेटा भी बड़ा है, न कि आप सचमुच समान गणना को 100,000 बार दोहराते हैं; यदि यह वास्तव में आपका मतलब है, तो ऐसा लगता है कि आपकी मूल योजना में कोई दोष है। – tripleee
यह 100,000 बार एक ही चीज़ दोहरा रहा है लेकिन हर बार, यह शीर्ष 100 bigrams लेता है और पाठ में हेरफेर करता है, इसलिए प्रत्येक पुनरावृत्ति पर bigrams निकालने के लिए इनपुट पाठ अलग है। – alvas
क्या आप बड़े 20 पहले बड़े मानते हैं।txt होना ['th', 'he', 'e', 'p', 'pr', 'ro', 'oj', 'je', 'ec', 'ct', 't', 'g ',' gu ',' ut ',' te ',' en ',' nb ',' be ',' er ',' rg '] जैसे आपका कोड उत्पन्न होता है, या शब्द-उन्मुख सबसेट जैसे [' th ' , 'हे', 'पीआर', 'आरओ', 'ओज', 'जे', 'ईसी', 'सीटी', 'gu', 'ut', 'te', 'en', 'nb', ' हो ',' एर ',' आरजी ',' ईबी ',' बो ',' ओओ ',' ओके ']? बस खेल के नियमों को समझने की कोशिश कर रहा है। – cdlane