“文本词频统计”实例详解(英文文本《巴黎圣母院》)

本文探讨了如何通过噪音处理和归一化对《巴黎圣母院》和《三国演义》进行文本分析,统计英文文本中单词频率并分析《三国演义》的人物分布,揭示了关键词的高频出现和人物角色的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:一篇文章出现了哪些词?哪些词出现得最多?

文本词频统计:

英文文本:《巴黎圣母院》 分析词频

中文文本:《三国演义》 分析人物

《巴黎圣母院》

将文本进行噪音处理、归一化,提取其中的每一个单词作为第一步骤。

我们首先需要进行读文件,然后再在所提取的文件里面进行统计。设计思路如下:

我们首先设立一个函数,进行文件的提取,函数命名为getText,利用open函数去将我们需要读取的文件进行提取,打开模式为r,为只读模式,我们将会在后面的文章进行详解文件的读取。同时利用lower方法将文章里面的所有大写字母变成小写字母,当然也可以利用upper()方法将文章里面的所有小写字母变成大写字母。视情况而定。之后我们进行遍历,利用for循环,将文章里面的所有特殊字符转变为空格!利用replace方法进行替换,replace方法为str.replace(旧字符,新字符,替换次数)。之后我们返回的文本即为英文文本里面大小写一致,而且没有特殊字符。可以进行更好的统计。所以我们在进行文本统计之前,先要对文本进行一定的转变,以便于我们进行更好的统计。即将文本进行噪音处理、归一化,提取其中的每一个单词作为第一步骤。代码如下所示:

def getText():
    txt=open("巴黎圣母院.txt","r").read()  #阅读文件,打开文件
    txt=txt.lower()   #将所有大写字母变成小写字母
    for ch in '!"#$%&()*+,-./:;<=>@[\\]^_{|}~':
        txt=txt.replace(ch,"")  #用空格将特殊字符进行取代
    return  txt

之后我们将所清理后的文本进行提取。我们将该值赋值给BaliTxt,即为转变后的文本。由于split方法可以按照指定分隔符对字符串进行分割,该方法会返回由分割后的子串组成的列表。所以我们利用该方法进行分割的同时返回列表。str.split(分隔符,分割次数)默认情况下为空字符和不限制分割次数。由于一个单词和他出现的次数构成了一种映射,我们来定义一种字典类型。来表达单词跟出现频率之间的对应关系。我们首先设立了一个空字典,然后对所出现的每个单词进行遍历,采用字典的.get方法,即d.get(k,<default>)键k存在,则返回键k的对应值,不在则返回<default>值。,即如果这个单词在字典里面,用当前的某一个英文单词作为键索引字典, 如果他在里边,那就返回他的次数,后面再加1,说明这个单词又出现了一次,如果这个单词不在字典中的话,我们选择0进行返回值,即0+1=1.即在字典里面添加一个值。

我们在判断过程中,我们利用字典即 counts[word]来进行判断,如果字典里面存在这个单词word,则返回即为word的次数,如果字典里面不存在,即 counts[word]=1,这时字典里面记录了这个单词出现的次数为1,下次再遇到相同单词的时候,即在字典里面存在的基础上再进行加1。相当于在字典里面新增了一个键值对元素。即counts为一个字典,word为他的键,1为这个键的值,即一次。代码如下所示:

BaliTxt=getText()
words=BaliTxt.split()  #默认采用空格将字符串中的信息进行分隔,并且以列表的形式返回给变量。
counts={}
for word in words:
    counts[word]=counts.get(word,0)+1  #字典的.get方法用来从字典中获得某一个键对应的值,其中用当前的某一个英文单词作为键索引字典
    # 如果他在里边,那就返回他的次数,这个单词不在字典中的话,我们就把它加到字典里面,并且赋给当前的值为0

之后我们需要对词频出现次数进行排序,首先我们将字典类型转换为列表类型便于操作。

首先我们利用字典的items方法获取字典的所有元素,然后将这些元素创建为列表类型,并且赋值给items。我们采用列表的sort方法。sort()方法,用于按特定顺序对列表元素进行排序。

语法格式如下:

sort(key=None,reverse=False)

以上格式中参数key用于指定排序规则,该参数可以是列表支持的函数,默认值为None,参数reverse用于控制列表元素排序的方式,该参数可以取值True或者False,取值为True表示降序排列,取值为False(默认值)表示升序排列。

在该代码中,我们将key设立为lambda x:x[1],其中lambda用来指定在列表中使用哪一个多元选项的列作为排序列,x:x[1]为对这个列表进行第二维排序,[0]为进行第一维排序。

完成一个列表根据键值对的2个元素的第2个元素进行排序,排序方式为由大到小的倒排
代码如下所示:


items=list(counts.items())  #返回一个列表
items.sort(key=lambda x:x[1],reverse=True)#True为返回时排序从大到小

之后,排序完成后,我们利用for循环将在前面的十个进行输出,首先我们将列表里面的前十个进行单词和统计次数的输出。在输出的时候,word为单词,count为次数。其中单词要求的是前十个,所以选择为{0:<10},而次数统计的话是从1位数开始到5位数之前,即{1:>5},代码示例如下:

for i in range(10):
    word,count=items[i]
    print("{0:<10}{1:>5}".format(word,count))

总体代码如下所示:

def getText():
    txt=open("巴黎圣母院.txt","r").read()  #阅读文件,打开文件
    txt=txt.lower()   #将所有大写字母变成小写字母
    for ch in '!"#$%&()*+,-./:;<=>@[\\]^_{|}~':
        txt=txt.replace(ch,"")  #用空格将特殊字符进行取代
    return  txt
BaliTxt=getText()
words=BaliTxt.split()  #默认采用空格将字符串中的信息进行分隔,并且以列表的形式返回给变量。
counts={}
for word in words:
    counts[word]=counts.get(word,0)+1  #字典的.get方法用来从字典中获得某一个键对应的值,其中用当前的某一个英文单词作为键索引字典
    # 如果他在里边,那就返回他的次数,这个单词不在字典中的话,我们就把它加到字典里面,并且赋给当前的值为0
items=list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)#True为返回时排序从大到小
for i in range(10):
    word,count=items[i]
    print("{0:<10}{1:<5}".format(word,count))

 运行界面如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直再追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值