使用python词频统计分析

前言

词频统计是指在文本或语音数据中,统计每个单词或符号出现的次数,以便对文本或语音数据进行分析和预处理。词频统计是自然语言处理中的一个重要任务,其目的是为后续的文本分析、情感分析、机器翻译等任务做好准备。

文本词频统计(英文字符)

1、普通版

python 复制代码
import re
def parse(text):
    # 使用正则表达式去除标点符号和换行符
    text = re.sub(r'[^\w ]', ' ', text)
    # 转为小写
    text = text.lower()
    
    # 生成所有单词的列表
    word_list = text.split(' ')
    
    # 去除空白单词,并转换为列表返回
    word_list = list(filter(None, word_list))
    
    return word_list
# 测试一下
sample_text = "Hello, World! \nThis is a test-text. Are you ready?"
print(parse(sample_text))    

结果如下:

powershell 复制代码
['hello', 'world', 'this', 'is', 'a', 'test_text', 'are', 'you', 'ready']

2.改良版

python 复制代码
import re
def parse_optimized(text):
    # 去除标点符号(替换为空格)
    text = re.sub(r'[^\w ]', ' ', text)
    
    # 转为小写,并直接使用 split() 自动处理连续空格
    return text.lower().split()
# 测试
sample_text = "Hello, World! \nThis is a test-text. Are you ready?"
print(parse_optimized(sample_text))

python中的split函数,如果不传任何参数(即直接写split()),它会自动按所有空白字符(空格,换行符\n,制表符\t)进行过分割,并且自动去除空字符。

文本词频统计(中文字符)

与英文字符不同,中文的字符之间是没有空格的,所以需引入jieba(结巴分词)进行词频统计。

1.普通版

python 复制代码
import re
import jieba
from collections import Counter
def get_chinese_word_freq(text, top_n=10):
    # 1. 数据清洗:去除标点符号、数字和英文字母(只保留中文字符)
    # 如果你想保留英文,可以把正则改成 r'[^\w\u4e00-\u9fa5]'
    cleaned_text = re.sub(r'[^\u4e00-\u9fa5]', '', text)
    
    # 2. 中文分词:使用 jieba 的 lcut 方法直接返回列表
    word_list = jieba.lcut(cleaned_text)
    
    # 3. 过滤无意义的词(可选,但强烈建议)
    # 在实际项目中,通常会读取一个"停用词表"(stop words)文件,这里做简单演示
    stop_words = {"的", "了", "和", "是", "就", "都", "而", "及", "与", "着", "或"}
    
    filtered_words = []
    for word in word_list:
        # 过滤掉停用词,并且通常过滤掉长度为 1 的单字(比如"我"、"你"、"啊")
        if word not in stop_words and len(word) >= 2:
            filtered_words.append(word)
            
    # 4. 统计词频:使用 Counter
    word_counts = Counter(filtered_words)
    
    # 5. 返回出现频率最高的 top_n 个词
    return word_counts.most_common(top_n)
# ================= 测试一下 =================
sample_text = """
自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。
它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。
自然语言处理是一门融语言学、计算机科学、数学于一体的科学。
因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,
所以它与语言学的研究有着密切的联系。
"""
# 获取词频最高的 5 个词
top_words = get_chinese_word_freq(sample_text, top_n=5)
print("中文词频统计结果:")
for word, freq in top_words:
    print(f"词语: '{word}'  => 出现次数: {freq}")

结果如下:

powershell 复制代码
中文词频统计结果:
词语: '自然语言'  => 出现次数: 4
词语: '领域'  => 出现次数: 3
词语: '研究'  => 出现次数: 3
词语: '处理'  => 出现次数: 2
词语: '计算机科学'  => 出现次数: 2	

jieba.lcut(text):这是结巴分词的核心方法,它会基于内置的强大中文库,利用统计算法(HMM模型),把一段连续的中文切分成一个词语列表。

\u4e00-\u9fa5 是汉字在 Unicode 编码中的范围。这个正则的意思是"把所有不是汉字的字符全部替换为空"

len(word) >= 2:中文里很多单字(如"的、地、得、我、你、他")通常对分析文章核心内容帮助不大,所以统计词频时经常会把长度小于 2 的词过滤掉。

Counter:Python 内置的计数神器,把它套在列表外面,它会自动帮你统计每个元素出现的次数,并提供 most_common() 方法直接排序输出。

2.改良版,与普通版相比,改进的一点是可以加载自定义词典和停用词库

python 复制代码
import re
import jieba
import os
from collections import Counter

def chinese_word_cut(mytext,top_n=10):
    dict_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '自定义词典.txt')
    jieba.load_userdict(dict_path )  # 这里你可以添加jieba库识别不了的网络新词,避免将一些新词拆开
    jieba.initialize()  # 初始化jieba
    # 文本预处理 :去除一些无用的字符只提取出中文出来
    new_data = re.findall('[\u4e00-\u9fa5]+', mytext)
    new_data = " ".join(new_data)
    # 文本分词
    seg_list_exact = jieba.lcut(new_data)
    result_list = []
    stop_words_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '停用词库.txt')
    # 读取停用词库
    with open(stop_words_path, encoding='utf-8') as f: # 可根据需要打开停用词库,然后加上不想显示的词语
        con = f.readlines()
        stop_words = set()
        for i in con:
            i = i.replace("\n", "")   # 去掉读取每一行数据的\n
            stop_words.add(i)
    # 去除停用词并且去除单字
    for word in seg_list_exact:
        if word not in stop_words and len(word) > 1:
            result_list.append(word)      
    return Counter(result_list).most_common(top_n)

comment = '大唐不夜城,不夜城趣味性很高,里面地方特色东西好吃,也有星巴克麦当劳等等选择,有不少场表演,外景夜景一定要薅一个,其它地方很难有这般景象了。娱乐体验了不倒翁,还有十二时辰里面表演更加精彩、内景拍照不错,簋唐楼可以尝试一下沉浸剧本杀......'
comment_cutted = chinese_word_cut(comment,top_n=5)

# word_counts.most_common(10) # 输出词频最高的前十个单词 
print("中文词频统计结果:")
for word, freq in comment_cutted:
    print(f"词语: '{word}'  => 出现次数: {freq}")

结果如下:

powershell 复制代码
中文词频统计结果:
词语: '不夜城'  => 出现次数: 2
词语: '里面'  => 出现次数: 2
词语: '地方'  => 出现次数: 2
词语: '表演'  => 出现次数: 2
词语: '大唐'  => 出现次数: 1