You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 17:47:37