在文本分析、日志处理、搜索系统以及自然语言处理(Natural Language Processing,NLP)中,词频统计(frequency counting)是最基础也最常见的任务之一。所谓词频统计,就是统计某个词、字符或某类模式在文本中出现了多少次。

词频统计通常要经历以下步骤:

1、文本标准化:统一大小写、去除多余空白、规范字符形式

2、文本清洗:去除标点、噪声字符或无关内容

3、文本切分:将字符串划分为词、行、字段或片段

4、条件筛选:保留需要统计的部分

5、词频统计:用 Counter 或字典统计结果

在这些步骤中,字符串(str)方法承担的是前四步中的核心任务。

一、查找与定位

1、统计子串出现次数

count()

返回子串 sub 在字符串中出现的非重叠次数。

str.count(sub[, start[, end]])

参数说明:

• sub:要统计的子串

• start:可选,起始位置

• end:可选,结束位置

示例:

# 3

count() 适合统计固定子串的出现次数。

但要注意,它统计的是子串匹配,不是“词语边界意义上的单词统计”。

例如:

# 3

2、查找出现的位置

find()

返回子串第一次出现的索引;若不存在,则返回 -1。

str.find(sub[, start[, end]])

参数说明:

• sub:要查找的子串

• start:可选,起始位置

• end:可选,结束位置

示例:

# 7

find() 常用于判断某个关键词是否存在(返回值 ≥ 0)。

rfind()

返回子串最后一次出现的索引;若不存在,则返回 -1。

str.rfind(sub[, start[, end]])

示例:

# 13

3、判断前后缀

startswith()

判断字符串是否以某个前缀开头。返回布尔值。

str.startswith(prefix[, start[, end]])

参数说明:

• prefix:前缀字符串或前缀元组

• start:可选,起始位置

• end:可选,结束位置

示例:

# True

在日志词频统计中,常用于筛选某类记录,例如只统计 "ERROR" 开头的行。

endswith()

判断字符串是否以某个后缀结尾。返回布尔值。

str.endswith(suffix[, start[, end]])

示例:

# True

说明:可用于筛选具有某种后缀特征的文本项。

二、规范化与清洗

词频统计前,常需要对字符串进行标准化处理。否则同一个词可能因为大小写、空白或字符形式不同而被统计成多个不同项。

1、大小写转换

lower()

返回全部字母转为小写后的新字符串。

str.lower()

示例:

# apple apple apple

说明:英文词频统计中非常常用。如果不做小写化处理,Apple、apple、APPLE 会被当成不同词。

upper()

返回全部字母转为大写后的新字符串。

str.upper()

说明:虽然词频统计中更常见的是 lower(),但在某些标记统一场景中也会用到 upper()。

casefold()

返回更适合做大小写无关比较的字符串。

str.casefold()

示例:

# apple apple

说明:对于一般英文文本,lower() 已经够用;但从“文本归一化”的角度说,casefold() 更适合做严格的大小写无关处理。

2、去除空白字符

strip()

去除字符串两端的指定字符,默认去除空白字符。返回处理后的新字符串。

str.strip([chars])

参数说明:

• chars:可选,要删除的字符集合

示例:

print(text.strip())

输出:

apple banana

说明:在处理逐行文本、日志文件或用户输入时非常常用。如果行首行尾残留空格,可能会影响统计一致性。

lstrip()/rstrip()

分别去除左侧或右侧空白字符(或指定字符)。

str.rstrip([chars])

说明:适合处理只需单侧清洗的场景。

3、删除前后缀

以下两个方法是 Python 3.9+ 新增方法。

removeprefix()

如果字符串以指定前缀开头,则删除此前缀;否则原样返回。

str.removeprefix(prefix)

示例:

# file not found

说明:适合统一处理日志前缀、标签前缀。

removesuffix()

如果字符串以指定后缀结尾,则删除该后缀;否则原样返回。

str.removesuffix(suffix)

示例:

# running

说明:适合去除句尾标点或固定后缀。

4、常规替换

replace()

将字符串中的子串 old 替换为 new。返回替换后的新字符串。

str.replace(old, new[, count])

参数说明:

• old:旧子串

• new:新子串

• count:可选,最大替换次数

示例:

print(cleaned)

输出:

hello world

replace() 常用于:

• 去除标点

• 统一特殊符号

• 将多个分隔符统一成同一种分隔符(如空格)

• 对缩写或变体进行规范化处理

5、高效替换

replace() 适合少量替换,而 translate() 可以基于字符映射表一次性完成大量字符替换或删除,因此在文本清洗中通常更高效。

maketrans()

生成一个字符转换表(translation table),用于 translate() 方法。

str.maketrans(x[, y[, z]])

参数说明:

z → 删除

translate()

按照 maketrans() 创建的映射规则对字符串进行批量替换或删除。返回处理后的新字符串。

str.translate(table)

参数说明:

• table:字符映射表

示例 1:删除标点符号

print(clean_text)

输出:

Hello world Python is great

string.punctuation 包含常见 ASCII 标点:

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

translate() 结合 string.punctuation 可以快速删除标点。

示例 2:字符删除

print(text.translate(table))

输出:

color favor

示例 3:中文标点清理

print(text.translate(table))

输出:

人工智能正在改变世界机器学习深度学习迅速发展

三、切分与重组

词频统计最核心的预处理之一,就是把原始字符串切分为“可统计单元”。

1、切分

split()

将字符串按分隔符切分为列表。

str.split(sep=None, maxsplit=-1)

参数说明:

• sep:分隔符;默认 None 表示按任意空白字符切分

• maxsplit:最大切分次数

示例:

print(words)

输出:

['apple', 'banana', 'orange', 'apple']

说明:英文文本处理中最常见。默认情况下,split() 会把连续空白视为一个分隔边界,因此非常适合基础单词切分。

例如:

print(text.split())

输出:

['apple', 'banana', 'orange', 'apple']

rsplit()

与 split() 类似,但从右边开始控制切分次数。

str.rsplit(sep=None, maxsplit=-1)

说明:在普通词频统计中不如 split() 常用,但在解析结构化文本时有价值。

splitlines()

按行边界切分文本。返回由各行组成的列表。

str.splitlines(keepends=False)

参数说明:

• keepends:是否保留换行符

示例:

print(text.splitlines())

输出:

['apple', 'banana', 'orange']

说明:适用于按行处理文本文件。

2、连接

join()

用当前字符串作为分隔符,将序列中的字符串拼接起来。

str.join(iterable)

参数说明:

• iterable:字符串可迭代对象

示例:

print(text)

输出:

natural language processing

说明:join() 常用于规范化后重新构造文本,将清洗后的词列表重新组织。

四、条件判断

这些函数常用于在统计前进行筛选。

isalpha()

如果字符串中所有字符都是字母且非空,则返回 True。

可用于英文文本中过滤掉包含数字或符号的项。

isdigit()

若字符串全为数字字符且非空,则返回 True。

可用于统计数字型词项,或在文本清洗时排除纯数字项。

isalnum()

若字符串全由字母和数字构成且非空,则返回 True。

在清洗混合文本时很常用。

isspace()

若字符串全为空白字符且非空,则返回 True。

可用于过滤空白项。

示例:

print("        ".isspace())  # True

小结

在词频统计任务中,str 类型的方法主要用于文本查找、清洗、规范化与切分,是构建统计流程的基础工具。通过 count()、lower()、replace()、split()、strip() 等函数,可以将原始文本整理为可统计的词项;再结合 Counter 或分词工具,便可完成英文或中文文本的基础词频分析。

打开网易新闻 查看精彩图片

点赞有美意,赞赏是鼓励