【算法】用哈希表分词统计 Bob Dylan 的歌词

2023-12-06 22:20

本文主要是介绍【算法】用哈希表分词统计 Bob Dylan 的歌词,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 概述

鲍勃迪伦是美国的一位伟大的诗人,一个伟大的曲作者,他颇具创造力的作品为美国文化甚 至整个世界的文化做出很多贡献。本文用 NLTK 提取鲍勃迪伦的歌词中的名词,将他的歌词 进行分词统计存储在一个哈希表中,并用 matplotlib 将出现词频率高的歌词进行可视化。

2. 问题分析

  1. 在实验的过程中,我们先从 github 中下载鲍勃迪伦的歌词,再在 python 中将歌词文件读入, 用 NLTK 中的函数将之中的名词提取。
  2. 在得到所有的名词列表后,使用哈希表来对歌词进行词频统计。
  3. 用哈希表来存储词频是一种很高效的方式,他是根据关键码值可直接访问的数据结构。
    在 python 中可以用字典将其实现。当我们要查找该单词的词频时,时间复杂度为 O(1)。
  4. 在词频统计之后,我们取出字典中名词出现频率最高的前 18 个名词,用 matlibplot 库将其图表打印出来。

3. 实验代码

// An highlighted block
import nltk 
import os 
import matplotlib.pyplot as plt path = "/Users/python/Desktop/BTH004 算法分析/中方/code/pycode/bobdylan/txt" #文件夹目录 
files= os.listdir(path) #得到文件夹下的所有文件名称 
nouns = [] for file in files: #遍历文件夹 position = path+'/'+ file#print (position) with open(position, "r",encoding='utf-8') as f: #打开文件 lines = f.read() sentences = nltk.sent_tokenize(lines) 	#print("1") for sentence in sentences: #print("1") for word,pos in nltk.pos_tag(nltk.word_tokenize(str(sentence))):if (pos == 'NN' or pos == 'NNP' or pos == 'NNS' or pos == 'NNPS'): #print(word)nouns.append(word)#print(nouns) 
#统计词频 
result = {} 
nounsdict = {} 
for key in nouns: if key in nounsdict: nounsdict[key] = nounsdict[key]+1 		else:nounsdict[key] = 1 #print(type(dict)) 
del nounsdict['*'] 
del nounsdict['“'] 
del nounsdict['>'] 
del nounsdict['”'] 
del nounsdict['–'] 
del nounsdict['<'] 
nounsdict= sorted(nounsdict.items(), key=lambda asd:asd[1], reverse = True) 
nounsdict = nounsdict[0:20] print(nounsdict) 
keys = [] 
y = [] for i in range(len(nounsdict)): 		keys.append(nounsdict[i][0]) y.append(nounsdict[i][1]) 
x=range(len(keys)) plt.figure() 
plt.bar(keys ,y) 
plt.xticks(x,keys,rotation=45) 
plt.xlabel("words") 
plt.ylabel("frequency") 
plt.title("the word’s frequency statistic of Bob Dylan song") plt.show()

4. 实验结果

在第一次的实验代码中,将得到结果按照词频排序,得到以下结果。此时我们发现,得到的 结果有很多冠词、介词等,我们需要对数据进行清洗。
在这里插入图片描述
于是我们重新编写代码,引入 python 的 nltk 自然语言处理包,将歌词中的名词提取出来。 进行词频统计,并存入哈希表。用 matplotlib 包将其可视化,我们得到了下面的结果。

在这里插入图片描述
鲍勃迪伦的音乐是他真诚表达人生观和态度的工具,他的歌词中大面积地出现爱,世界、心、 时间等词汇,歌颂着爱、孤独与自由。他的愤怒温柔而有力,他的歌词美好又平静。诺贝尔文学奖用行动证明,最震撼人心极具文学表现力和时代影响力的歌词一样是最伟大的诗歌、 最伟大的文学作品。

5. 实验总结

在实验的过程中,碰到了一些问题,比如:

  1. 关于 python 读文件的操作
    解决方案: 使用了 python 下的 os 库

  2. 得到的数据多是助动词、介词、冠词,相对参考价值较小
    解决方案: 对数据进行提取,改变分词策略,只提取歌词中的名词。

  3. 无法使用 nltk 下的 download()函数
    解决方案: 可以存在一些代理服务器的问题,手动下载文件并放置在相对路径下,问题解决。

实验心得:
本次实验用了很多 python 的内置库,让我对于 python 的使用更加熟悉了。另外,不同的 库有着不同的功能,觉得很有意思。
哈希表可以提供快速的插入和查找操作,不论哈希表中有多少数据,都具有接近常量的操作 时间级,不仅速度快,而且实现也非常容易。

参考和致谢

【娱乐向】如何统计 David Bowie 的歌词词频
https://blog.csdn.net/weixin_43230147/article/details/109323025.
使用 python 从 NLTK 中提取名词短语 http://www.voidcn.com/article/p-fxffnovl-bws.html.
bob_dylan_lyrics 鲍勃迪伦歌词集 https://github.com/mulhod/bob_dylan_lyrics.

这篇关于【算法】用哈希表分词统计 Bob Dylan 的歌词的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/463554

相关文章

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Java如何将文件内容转换为MD5哈希值

《Java如何将文件内容转换为MD5哈希值》:本文主要介绍Java如何将文件内容转换为MD5哈希值的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java文件内容转换为MD5哈希值一个完整的Java示例代码代码解释注意事项总结Java文件内容转换为MD5

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA