import site import os, re, time import string, operator ################################################################################ # 变量 ################################################################################ testfilename = 'test.txt' testfilename = 'pride-and-prejudice.txt' testfilename = 'Prey.txt' db_filename = "tf.db" site_packages = site.getsitepackages() for package in site_packages: if 'package' in package: basePath = package stopwordfilepath = os.path.join(basePath, 'cppy', 'data', 'stop_words.txt') testfilepath = os.path.join(basePath, 'cppy', 'data', testfilename) ################################################################################ # 项目函数 ################################################################################ def read_file(path_to_file): """ 读取指定文件的内容。 Args: path_to_file (str): 文件路径。 Returns: str: 文件内容。 """ with open(path_to_file, encoding='utf-8') as f: data = f.read() return data def re_split(data): """ 使用正则表达式分割字符串,将非字母字符替换为空格,并将所有字符转换为小写。 Args: data (str): 输入字符串。 Returns: list: 分割后的单词列表。 """ pattern = re.compile('[\W_]+') data = pattern.sub(' ', data).lower() return data.split() def get_stopwords(path_to_file=stopwordfilepath): """ 获取停用词列表。 Args: path_to_file (str): 停用词文件路径,默认为 stopwordfilepath。 Returns: list: 停用词列表。 """ with open(path_to_file, encoding='utf-8') as f: data = f.read().split(',') data.extend(list(string.ascii_lowercase)) return data def get_chunks(file_path=testfilepath, chunk_size=1000): """ 将文件内容分割成多个块。 Args: file_path (str): 文件路径,默认为 testfilepath。 chunk_size (int): 每个块的大小,默认为 1000。 Returns: list: 分割后的块列表。 """ content = re_split(read_file(file_path)) chunks = [ content[i:i + chunk_size] for i in range(0, len(content), chunk_size) ] return chunks def extract_file_words(path_to_file): """ 提取文件中的单词,去除停用词和长度小于3的单词。 Args: path_to_file (str): 文件路径。 Returns: list: 提取后的单词列表。 """ word_list = re_split(read_file(path_to_file)) stop_words = get_stopwords() return [w for w in word_list if (w not in stop_words) and len(w) >= 3] def extract_str_words(data_str): """ 提取字符串中的单词,去除停用词和长度小于3的单词。 Args: data_str (str): 输入字符串。 Returns: list: 提取后的单词列表。 """ word_list = re_split(data_str) stop_words = get_stopwords() return [w for w in word_list if (w not in stop_words) and len(w) >= 3] def count_word(word, word_freqs, stopwords): """ 统计单词频率。 Args: word (str): 单词。 word_freqs (dict): 单词频率字典。 stopwords (list): 停用词列表。 """ if word not in stopwords: word_freqs[word] = word_freqs.get(word, 0) + 1 def get_frequencies(word_list): """ 获取单词频率。 Args: word_list (list): 单词列表。 Returns: dict: 单词频率字典。 """ word_freqs = {} for word in word_list: word_freqs[word] = word_freqs.get(word, 0) + 1 return word_freqs def sort_dict(word_freq): """ 对字典进行排序。 Args: word_freq (dict): 单词频率字典。 Returns: list: 排序后的单词频率列表。 """ return sorted(word_freq.items(), key=operator.itemgetter(1), reverse=True) def print_word_freqs(word_freqs, n=10): """ 打印单词频率。 Args: word_freqs (list): 单词频率列表。 n (int): 打印的单词数量,默认为 10。 """ for (w, c) in word_freqs[:n]: print(w, '-', c) ################################################################################ # 通用工具 ################################################################################ def timing_decorator(func): def wrapper(*args, **kwargs): start_time = time.time() # 记录开始时间 result = func(*args, **kwargs) # 调用原始函数 end_time = time.time() # 记录结束时间 run_time = end_time - start_time # 计算运行时间 print(f"{func.__name__} 运行时间: {run_time*1000:.2f} 秒") return result return wrapper def test(): print('cppy welcome')