|
|
|
|
################ 待整理
|
|
|
|
|
'''
|
|
|
|
|
应用场景针对各个组件的 notify 方法发指令来驱动所有工作
|
|
|
|
|
这是一个示例性质的原型,具体分布式环境下需要调整
|
|
|
|
|
|
|
|
|
|
notify 用了四种写法,是和本主题无关的测试
|
|
|
|
|
'''
|
|
|
|
|
from cppy.cp_util import *
|
|
|
|
|
from collections import defaultdict
|
|
|
|
|
|
|
|
|
|
badmsg = lambda : exec (''' raise Exception("Message not understood " , action ) ''')
|
|
|
|
|
class fff:
|
|
|
|
|
def __init__(self, d):
|
|
|
|
|
self._data = defaultdict( badmsg )
|
|
|
|
|
self._data.update(d)
|
|
|
|
|
|
|
|
|
|
def __getitem__(self, key):
|
|
|
|
|
return self._data[key]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DataStorageMod():
|
|
|
|
|
def __init__(self):
|
|
|
|
|
self._data = []
|
|
|
|
|
|
|
|
|
|
def notify(self, action, *args):
|
|
|
|
|
return {
|
|
|
|
|
'init': lambda : self._init,
|
|
|
|
|
'words': lambda : self._words
|
|
|
|
|
}.get( action , badmsg )()(*args)
|
|
|
|
|
|
|
|
|
|
def _init(self, path_to_file):
|
|
|
|
|
self._data = re_split( read_file(path_to_file) )
|
|
|
|
|
|
|
|
|
|
def _words(self):
|
|
|
|
|
return self._data
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class StopWordMod():
|
|
|
|
|
_stop_words = []
|
|
|
|
|
|
|
|
|
|
def notify(self, action, *args):
|
|
|
|
|
return { 'init': self._init,
|
|
|
|
|
'is_stop_word': self._is_stop_word
|
|
|
|
|
}[ action ](*args)
|
|
|
|
|
|
|
|
|
|
def _init(self):
|
|
|
|
|
self._stop_words = get_stopwords()
|
|
|
|
|
|
|
|
|
|
def _is_stop_word(self, wordx):
|
|
|
|
|
return wordx in self._stop_words
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class WordFrequencyMod():
|
|
|
|
|
_word_freqs = {}
|
|
|
|
|
|
|
|
|
|
def notify(self, action, *args):
|
|
|
|
|
return fff( {
|
|
|
|
|
'increment_count': lambda : self._increment_count,
|
|
|
|
|
'sorted': lambda : self._sorted
|
|
|
|
|
})[ action ]()(*args)
|
|
|
|
|
|
|
|
|
|
def _increment_count(self, word):
|
|
|
|
|
self._word_freqs[word] = self._word_freqs.get(word,0) + 1
|
|
|
|
|
|
|
|
|
|
def _sorted(self):
|
|
|
|
|
return sort_dict(self._word_freqs)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ScenarioManager():
|
|
|
|
|
|
|
|
|
|
def notify(self, action, *args):
|
|
|
|
|
if action == 'init':
|
|
|
|
|
return self._init( *args)
|
|
|
|
|
elif action == 'run':
|
|
|
|
|
return self._run()
|
|
|
|
|
else:
|
|
|
|
|
raise Exception("Message not understood " + action )
|
|
|
|
|
|
|
|
|
|
def _init(self, path_to_file):
|
|
|
|
|
self._storage_manager = DataStorageMod()
|
|
|
|
|
self._stop_word_manager = StopWordMod()
|
|
|
|
|
self._word_freq_manager = WordFrequencyMod()
|
|
|
|
|
self._storage_manager.notify('init', path_to_file)
|
|
|
|
|
self._stop_word_manager.notify('init')
|
|
|
|
|
|
|
|
|
|
def _run(self):
|
|
|
|
|
for word in self._storage_manager.notify('words'):
|
|
|
|
|
if not self._stop_word_manager.notify('is_stop_word', word):
|
|
|
|
|
self._word_freq_manager.notify('increment_count', word )
|
|
|
|
|
|
|
|
|
|
word_freqs = self._word_freq_manager.notify('sorted')
|
|
|
|
|
print_word_freqs(word_freqs)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
sm = ScenarioManager()
|
|
|
|
|
sm.notify('init', testfilepath)
|
|
|
|
|
sm.notify('run')
|