在文本分析、日志处理以及自然语言处理中,词频统计(word frequency counting)通常以字典(dict)作为核心数据结构来保存统计结果。

字典是一种键值映射结构:

• 键(key):词项(word / term)

• 值(value):出现次数(frequency)

例如:

{    "python": 5,    "data": 3,    "analysis": 2}

在词频统计流程中:

• 字符串方法负责文本清洗与切分

• 字典方法负责统计、更新与管理词频结果

字典提供基于哈希表(hash table)的键值映射结构,能够以平均 𝑂(1) 时间复杂度完成查找与更新,因此非常适合词频统计这一类“动态计数”任务。

一、创建与初始化词频字典

在统计开始前,通常需要创建一个空字典,用于保存统计结果。

freq = {}

当遍历词列表时,可以逐步更新字典中的统计值。

示例:

words = ["apple", "banana", "apple", "orange", "banana", "apple"]
freq = {}
for w in words:    if w not in freq:        freq[w] = 0    freq[w] += 1
print(freq)

输出:

{'apple': 3, 'banana': 2, 'orange': 1}

这种方式体现了字典统计的基本逻辑:

• 若键不存在,则创建

• 若键存在,则更新值

二、安全读取词频值

在统计过程中,经常需要读取某个词当前的统计值。如果该词尚未出现,则可能产生异常。

get()

返回指定键对应的值;若键不存在,则返回默认值。

dict.get(key[, default])

参数说明:

• key:要查询的键

• default:键不存在时返回的默认值(默认 None)

示例:

freq = {"apple": 3, "banana": 2}
print(freq.get("apple"))print(freq.get("orange", 0))

输出:

30

在词频统计中,get() 常用于避免 KeyError。

例如:

freq = {}
for w in words:    freq[w] = freq.get(w, 0) + 1

这种写法是 Python 中最常见的词频统计模式。

setdefault()

用于在访问键的同时,为不存在的键设置默认值。

dict.setdefault(key[, default])

参数说明:

• key:要查询的键

• default:当键不存在时插入的默认值(默认 None)

返回值:

• 若键存在,返回该键对应的值

• 若键不存在,则插入 key: default,并返回 default

示例:

freq = {"apple": 3}
print(freq.setdefault("apple", 0))print(freq.setdefault("banana", 0))print(freq)

输出:

30{'apple': 3, 'banana': 0}

解释:

• "apple" 已存在,因此直接返回 3

• "banana" 不存在,因此创建 "banana": 0 并返回 0

在词频统计中,setdefault() 也可以用于初始化计数。

例如:

freq = {}
for w in words:    freq.setdefault(w, 0)    freq[w] += 1

不过在实际代码中,更常见的写法仍然是使用 get() 函数。

三、更新词频统计

在统计过程中,需要不断更新字典中的值。

update()

使用另一个映射或键值对更新字典。

dict.update([other])

参数说明:

• other:映射对象(mapping)或 (key, value) 对序列

示例:

freq = {"apple": 3}freq.update({"banana": 2})print(freq)

输出:

{'apple': 3, 'banana': 2}

在词频统计中,update() 主要用于合并统计结果。

例如:

freq1 = {"apple": 3, "banana": 2}freq2 = {"banana": 1, "orange": 4}freq1.update(freq2)

注意:

update() 会直接覆盖旧值,而不是累加,因此不适合直接合并两个词频统计结果。

如果需要累加词频,应当使用循环、collections.Counter 或自定义合并逻辑,因为 update() 的语义是覆盖映射关系,而不是执行数值运算。

四、删除词项

在某些场景下,需要从统计结果中删除某些词项,例如停用词(stopwords)或低频词。

pop()

删除指定键并返回其值。

dict.pop(key[, default])

参数说明:

• key:要删除的键

• default:键不存在时返回的默认值

示例:

freq = {"apple": 3, "banana": 2, "orange": 1}freq.pop("orange")print(freq)

输出:

{'apple': 3, 'banana': 2}

popitem()

删除并返回字典中的最后一个键值对(Python 3.7+ 为 LIFO)。

这是因为 Python 3.7 起字典保持插入顺序,因此 popitem() 会移除最近插入的元素。

dict.popitem()

示例:

freq = {"apple": 3, "banana": 2}print(freq.popitem())

输出:

('banana', 2)

该方法较少用于词频统计,但在某些数据结构处理中有价值。

五、遍历词频字典

统计完成后,通常需要遍历字典进行输出或进一步处理。

keys()

返回字典的所有键。

dict.keys()

示例:

freq = {"apple": 3, "banana": 2}
for word in freq.keys():    print(word)

输出:

applebanana

values()

返回字典的所有值。

dict.values()

示例:

freq = {"apple": 3, "banana": 2}print(list(freq.values()))

输出:

[3, 2]

items()

返回键值对视图。

dict.items()

示例:

freq = {"apple": 3, "banana": 2}
for word, count in freq.items():    print(word, count)

输出:

apple 3
banana 2

在词频统计中,items() 是最常用的遍历方式。

六、排序与输出

词频统计完成后,常常需要按照频次排序输出。

排序通常要用到内置函数 sorted(),并与字典的 items() 结合使用。

示例:

freq = {"apple": 3, "banana": 2, "orange": 1}result = sorted(freq.items(), key=lambda item: item[1], reverse=True)print(result)

输出:

[('apple', 3), ('banana', 2), ('orange', 1)]

解释:

• freq.items() 返回 (word, count) 结构

• item[1] 表示按频次排序

• reverse=True 表示降序排列

七、词频统计流程示例

下面给出一个简单的英文词频统计示例。

import string
text = """Python is powerful. Python is easy to learn.Many developers use Python for data analysis."""
# 1. 统一小写text = text.lower()
# 2. 删除英文标点table = str.maketrans("", "", string.punctuation)text = text.translate(table)
# 3. 切分为词words = text.split()
# 4. 统计词频freq = {}
for w in words:    freq[w] = freq.get(w, 0) + 1
# 排序输出for word, count in sorted(freq.items(), key=lambda item: item[1], reverse=True):    print(word, count)

📘 小结

在词频统计任务中,字典(dict)是保存统计结果的核心数据结构。通过 get() 可以安全地读取并更新计数,通过 update() 与 pop() 可以管理统计结果,通过 keys()、values()、items() 可以遍历词频数据,再结合 sorted() 即可完成按频次排序输出。字典基于哈希表实现,能够以接近 𝑂(1) 的效率完成查找与更新,因此非常适合动态词频统计。

图片

“点赞有美意,赞赏是鼓励”

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐