python实现简单的词形统计

用python正则表达式实现简单的词形统计
需求如下:

在这里插入图片描述

  交流了好长时间才知道她要的是词形统计,如AA.AAB,AABB...
编码如下
import re
from matplotlib import font_manager
import matplotlib.pyplot as plt
import numpy as np
def read_file_gbk(filename):
    with open(filename,'r',encoding='GBK') as f:
        s = f.read()
        s = re.sub('/C', '', s)
        s = re.sub('\r|\n|\s','',s)
    return s
def read_file_utf8(filename):
    with open(filename,'r',encoding='utf-8') as f:
        s = f.read()
        s = re.sub('/C', '', s)
        s = re.sub('\r|\n|\s','',s)
    return s
def dict_sort(dictname):
    dictlist = sorted(dictname.items(),key=lambda x:x[1],reverse=True)
    return dict(dictlist)
def main():

    #  读取文本,输出为长串字符
    s = read_file_gbk('zz.txt')
    # 通过标点符合进行切分,同时去掉特殊字符
    sentences = re.split(r' *[\.\?!,。…… —— oo ll 99][\'"\)\]]* *', s)
    #初始化《主角》 数量
    SIZE_AA_ZZ = 0;
    SIZE_AABB_ZZ = 0;
    SIZE_ABB_ZZ = 0;
    SIZE_ABAB_ZZ = 0;
    for stuff in sentences:
        # print(stuff)
        # 原理解析
        # "(.)\1(.)\2"这个正则,
        # .表示除换行外任意字符
        # \1 表示第一个括号里面的字符重复,默认重复一次,想重复4次加{4} 即(.)\1{4}
        # \2 表示第二个括号里面的字符重复
        # 开始匹配AA
        strings = re.finditer(r'(.)\1', stuff)

        # print(type(strings))
        for i in strings:
            print(i)
            SIZE_AA_ZZ = SIZE_AA_ZZ+1
        strings = re.finditer(r'(.)\1(.)\2', stuff)
        for i in strings:
            print(i)
            SIZE_AABB_ZZ =SIZE_AABB_ZZ+1
        strings = re.finditer(r'(.)\1(.)\2', stuff)
        for i in strings:
            print(i)
            SIZE_ABB_ZZ =SIZE_ABB_ZZ+1
        strings = re.finditer(r'(..)\1', stuff)
        for i in strings:
            print(i)
            SIZE_ABAB_ZZ =SIZE_ABAB_ZZ+1

    s = read_file_utf8('qq.txt')
    print(s)
    sentences = re.split(r' *[\.\?!,。…… —— oo ll 99 00 44 66 11 一一 tt // ww][\'"\)\]]* *', s)
    #初始化《秦腔》 数量
    SIZE_AA_QQ = 0
    SIZE_AABB_QQ = 0
    SIZE_ABB_QQ = 0
    SIZE_ABAB_QQ = 0
    for stuff in sentences:
        # print(stuff)
        # 开始匹配AA
        strings = re.finditer(r'(.)\1', stuff)

        # print(type(strings))
        for i in strings:
            print(i)
            SIZE_AA_QQ = SIZE_AA_QQ+1
        strings = re.finditer(r'(.)\1(.)\2', stuff)
        for i in strings:
            print(i)
            SIZE_AABB_QQ =SIZE_AABB_QQ+1
        strings = re.finditer(r'(.)\1(.)\2', stuff)
        for i in strings:
            print(i)
            SIZE_ABB_QQ =SIZE_ABB_QQ+1
        strings = re.finditer(r'(..)\1', stuff)
        for i in strings:
            print(i)
            SIZE_ABAB_QQ =SIZE_ABAB_QQ+1
    print("《主角》中的AA形式有"+str(SIZE_AA_ZZ)+"个")
    print("《主角》中的AABB形式有"+str(+SIZE_AABB_ZZ)+"个")
    print("《主角》中的ABB形式有"+str(SIZE_ABB_ZZ)+"个")
    print("《主角》中的ABAB形式有"+str(SIZE_ABAB_ZZ)+"个")
    print("《秦腔》中的AA形式有"+str(SIZE_AA_QQ)+"个")
    print("《秦腔》中的AABB形式有"+str(SIZE_AABB_QQ)+"个")
    print("《秦腔》中的ABB形式有"+str(SIZE_ABB_QQ)+"个")
    print("《秦腔》中的ABAB形式有"+str(SIZE_ABAB_QQ)+"个")
    # start draw

    # 构建数据
    x_data = ['AA', 'AABB', 'ABB', 'ABAB']
    y_data = [SIZE_AA_ZZ, SIZE_AABB_ZZ,SIZE_ABB_ZZ, SIZE_ABAB_ZZ]
    y_data2 = [SIZE_AA_QQ, SIZE_AABB_QQ,SIZE_ABB_QQ, SIZE_ABAB_QQ]
    bar_width = 0.3
    my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\simkai.ttf', size=12)
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    # 将X轴数据改为使用range(len(x_data), 就是0、1、2...
    plt.bar(x=x_data, height=y_data, label='主角',
            color='steelblue', alpha=0.8, width=bar_width)
    # 将X轴数据改为使用np.arange(len(x_data))+bar_width,
    # 就是bar_width、1+bar_width、2+bar_width...这样就和第一个柱状图并列了
    plt.bar(x=np.arange(len(x_data)) + bar_width, height=y_data2,
            label='秦腔', color='indianred', alpha=0.8, width=bar_width)
    # 在柱状图上显示具体数值, ha参数控制水平对齐方式, va控制垂直对齐方式
    for x, y in enumerate(y_data):
        plt.text(x, y + 100, '%s' % y, ha='center', va='bottom')
    for x, y in enumerate(y_data2):
        plt.text(x + bar_width, y + 100, '%s' % y, ha='center', va='top')
    # 设置标题
    plt.title("《主角》与《秦腔》对比")
    # 为两条坐标轴设置名称
    plt.xlabel("类型")
    plt.ylabel("数量")
    # 显示图例
    plt.legend()
    plt.show()






if __name__=="__main__":
    main()
调试结果

在这里插入图片描述

总结
 思路很简单,就是读文件-->分句-->正则提取-->统计-->绘图。话不多说,继续我的java搬砖大业了哈哈
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值