【算法】用哈希表分词统计 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

相关文章

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c