在文本分析、日志处理、搜索系统以及自然语言处理(Natural Language Processing,NLP)中,词频统计(frequency counting)是最基础也最常见的任务之一。所谓词频统计,就是统计某个词、字符或某类模式在文本中出现了多少次。
词频统计通常要经历以下步骤:
1、文本标准化:统一大小写、去除多余空白、规范字符形式
2、文本清洗:去除标点、噪声字符或无关内容
3、文本切分:将字符串划分为词、行、字段或片段
4、条件筛选:保留需要统计的部分
5、词频统计:用 Counter 或字典统计结果
在这些步骤中,字符串(str)方法承担的是前四步中的核心任务。
一、查找与定位
1、统计子串出现次数
count()
返回子串 sub 在字符串中出现的非重叠次数。
str.count(sub[, start[, end]])参数说明:
• sub:要统计的子串
• start:可选,起始位置
• end:可选,结束位置
示例:
# 3count() 适合统计固定子串的出现次数。
但要注意,它统计的是子串匹配,不是“词语边界意义上的单词统计”。
例如:
# 32、查找出现的位置
find()
返回子串第一次出现的索引;若不存在,则返回 -1。
str.find(sub[, start[, end]])参数说明:
• sub:要查找的子串
• start:可选,起始位置
• end:可选,结束位置
示例:
# 7find() 常用于判断某个关键词是否存在(返回值 ≥ 0)。
rfind()
返回子串最后一次出现的索引;若不存在,则返回 -1。
str.rfind(sub[, start[, end]])示例:
# 133、判断前后缀
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 worldreplace() 常用于:
• 去除标点
• 统一特殊符号
• 将多个分隔符统一成同一种分隔符(如空格)
• 对缩写或变体进行规范化处理
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 greatstring.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 或分词工具,便可完成英文或中文文本的基础词频分析。
“点赞有美意,赞赏是鼓励”
热门跟贴