Python实现:计算句子列表中指定单词前数字的平均值
问题原因
你的二元组匹配方向写反了。NLTK的bigrams生成的序列结构为(前序词, 后序词),你当前代码筛选item[0] == 'minutes',拿到的是所有minutes后面跟着的词,完全没匹配到它前面的内容,自然提取不到紧邻的前置数字。
修正方案
调整筛选规则:匹配二元组中后一个元素为目标词的条目,再校验前一个元素是否为合法数字,收集所有符合条件的数字计算平均值即可。下面是封装好的通用函数,兼容你现有的pandas语料处理逻辑,支持传入任意目标词查询:
import pandas as pd from nltk import bigrams def calc_avg_num_before_target(corpus_series: pd.Series, target_word: str) -> float: """ 计算语料中指定目标单词前紧邻数字的平均值 :param corpus_series: 预处理后的文本列,对应你代码里的all_data['PreProcess'] :param target_word: 要查询的目标单词,匹配时不区分大小写 :return: 符合条件的数字平均值,无匹配结果时返回0 """ target_lower = target_word.lower() num_list = [] # 逐句生成bigram,避免跨句拼接出无效二元组 for sent in corpus_series.str.lower().str.split(): for prev_word, curr_word in bigrams(sent): # 命中目标词时校验前一个词是否为数字(兼容整数、小数格式) if curr_word == target_lower and prev_word.replace('.', '', 1).isdigit(): num_list.append(float(prev_word)) return sum(num_list)/len(num_list) if num_list else 0.0 # 调用示例 if __name__ == "__main__": # 替换成你自己的数据源即可 # all_data = pd.read_csv("your_dataset.csv") test_corpus = pd.Series([ 'I had to wait 30 minutes', 'It took too long had to wait 35 minutes' ]) avg_result = calc_avg_num_before_target(test_corpus, 'minutes') print(avg_result) # 输出32.5,和预期结果一致
补充说明
- 如果需要批量查询多个目标词的结果,可以把语料分词、生成bigram的逻辑从函数里抽离,只生成一次二元组序列再复用,能大幅提升运行效率。
- 如果你的语料里存在带千分位逗号的数字(比如
1,500 minutes),只需要在数字校验逻辑前加一行prev_word = prev_word.replace(',', '')即可正常识别。 - 如果你还要保留之前统计数字后高频词汇的需求,只需要在遍历bigram的循环里加一个分支,判断前序词为数字时收集后序词做词频统计即可,不需要重复处理语料。
内容的提问来源于stack exchange,提问作者FlubberBeer
相关产品推荐
相关产品推荐

