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

分词文本中N-gram频率计算代码的优化方案问询

优化N-gram频率统计的高效方案

嘿,你的代码能得到正确结果,但确实有更高效的优化方向!先说说原代码的问题:你现在的写法是对ngramlist里的每个元素,都完整遍历一遍ngrams去统计次数,时间复杂度是O(M*N)(M是ngramlist长度,N是ngrams长度),当数据量变大时,重复遍历会浪费很多时间。

下面给你两种更优的实现方式:

方法一:用标准库collections.Counter(推荐)

这是最简洁高效的方案,只需要遍历ngrams一次统计所有元素的频率,之后直接查表即可,时间复杂度降到O(M+N):

from collections import Counter

# 一次性统计所有N-gram的出现次数
ngram_counter = Counter(ngrams)
total_ngrams = len(ngrams)

# 遍历ngramlist,通过Counter快速获取频率占比
freqlist = [ngram_counter.get(ngram, 0) / total_ngrams for ngram in ngramlist]
  • Counter(ngrams)会生成一个字典,键是N-gram,值是对应出现次数
  • .get(ngram, 0)用来处理ngramlist里的元素不在ngrams中的情况(返回0,避免KeyError)
  • 整个过程只遍历ngrams一次,比原代码的重复遍历高效太多,尤其是当ngrams很长的时候。

方法二:简化原代码(小数据量可用)

如果你的数据量不大,也可以先用list.count()简化原代码(本质还是O(M*N),但写法更简洁):

total_ngrams = len(ngrams)
freqlist = [ngrams.count(ngram) / total_ngrams for ngram in ngramlist]

不过这种方法本质和你的原代码逻辑一样,只是利用了Python内置的count方法简化了代码,效率上没有根本性提升。

方法三:大数据量用Pandas(可选)

如果处理的是超大规模的数据集,也可以用Pandas的value_counts来统计,性能同样不错:

import pandas as pd

ngram_series = pd.Series(ngrams)
ngram_counts = ngram_series.value_counts()
total_ngrams = len(ngram_series)

freqlist = [ngram_counts.get(ngram, 0) / total_ngrams for ngram in ngramlist]

但需要额外安装Pandas依赖,所以如果只是常规场景,Counter完全够用。

内容的提问来源于stack exchange,提问作者Ilya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:05:43