parent
068c0f9bb8
commit
7d03c9e5f0
@ -1,34 +0,0 @@
|
||||
from collections import Counter
|
||||
import cppy.cp_util as util
|
||||
|
||||
def word_frequency( top_n=10 ):
|
||||
def decorator(func):
|
||||
def wrapper(*args, **kwargs):
|
||||
# 执行被装饰的函数
|
||||
result = func(*args, **kwargs)
|
||||
|
||||
# 初始化词频计数器
|
||||
word_counts = Counter()
|
||||
|
||||
# 分词并计数
|
||||
for word in util.extract_str_words(result):
|
||||
word_counts[word] += 1
|
||||
|
||||
# 输出所有词的频率最高的n个词
|
||||
most_common = word_counts.most_common(top_n)
|
||||
util.print_word_freqs( most_common )
|
||||
|
||||
return result
|
||||
|
||||
return wrapper
|
||||
return decorator
|
||||
|
||||
|
||||
# 使用装饰器
|
||||
@word_frequency( top_n=10 )
|
||||
def read_file(file_path):
|
||||
with open(file_path, 'r', encoding='utf-8') as file:
|
||||
return file.read()
|
||||
|
||||
|
||||
read_file( util.testfilepath )
|
@ -1,78 +0,0 @@
|
||||
'''
|
||||
主逻辑将关键动作开放为注册服务
|
||||
各个组件注册到事件管理器相应服务
|
||||
事件管理器按顺序执行注册的事件
|
||||
'''
|
||||
|
||||
from collections import defaultdict
|
||||
from cppy.cp_util import *
|
||||
|
||||
#
|
||||
# event_manager
|
||||
#
|
||||
class EventManager:
|
||||
def __init__(self):
|
||||
self.load_handlers = [] # 用于加载文件的事件处理器
|
||||
self.process_handlers = [] # 用于处理数据的事件处理器
|
||||
self.end_handlers = [] # 用于结束流程的事件处理器
|
||||
|
||||
def register_load_event(self, handler):
|
||||
self.load_handlers.append(handler)
|
||||
|
||||
def register_process_event(self, handler):
|
||||
self.process_handlers.append(handler)
|
||||
|
||||
def register_end_event(self, handler):
|
||||
self.end_handlers.append(handler)
|
||||
|
||||
# 运行框架,按顺序执行注册的事件处理器
|
||||
def run(self, file_path):
|
||||
for handler in self.load_handlers: handler(file_path)
|
||||
for handler in self.process_handlers: handler()
|
||||
for handler in self.end_handlers: handler()
|
||||
|
||||
|
||||
#
|
||||
# 功能组件
|
||||
#
|
||||
# 定义数据存储类,用于模拟文件内容的加载和处理
|
||||
class TextData:
|
||||
_word_event_handlers = []
|
||||
|
||||
def __init__( self, event_manager ):
|
||||
self._stop_words = get_stopwords()
|
||||
event_manager.register_load_event(self.__load)
|
||||
event_manager.register_process_event(self.__process_words)
|
||||
|
||||
def __load(self, path_to_file):
|
||||
self._data = re_split( read_file(path_to_file) )
|
||||
|
||||
def __process_words(self):
|
||||
for word in self._data:
|
||||
if word not in self._stop_words:
|
||||
for handler in self._word_event_handlers:
|
||||
handler(word)
|
||||
|
||||
def register_word_event(self, handler):
|
||||
self._word_event_handlers.append(handler)
|
||||
|
||||
|
||||
class WordFrequencyCounter:
|
||||
def __init__(self, event_manager, data_storage):
|
||||
self._word_freqs = defaultdict(int) # 存储单词频率
|
||||
data_storage.register_word_event(self.__increment_count) # 注册单词事件
|
||||
event_manager.register_end_event(self.__print_freqs) # 注册结束事件
|
||||
|
||||
def __increment_count(self, word):
|
||||
self._word_freqs[word] += 1
|
||||
|
||||
def __print_freqs(self):
|
||||
print_word_freqs ( sort_dict (self._word_freqs) )
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
em = EventManager()
|
||||
data_storage = TextData(em)
|
||||
word_freq_counter = WordFrequencyCounter(em, data_storage)
|
||||
|
||||
em.run(testfilepath)
|
@ -1,6 +1,9 @@
|
||||
import time
|
||||
import cppy.cp_util as util
|
||||
|
||||
'''
|
||||
用反射实现装饰器的效果
|
||||
'''
|
||||
|
||||
# 工具函数
|
||||
def extract_words(path_to_file):
|
Loading…
Reference in new issue