本文主要是介绍【算法】用哈希表分词统计 Bob Dylan 的歌词,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 概述
鲍勃迪伦是美国的一位伟大的诗人,一个伟大的曲作者,他颇具创造力的作品为美国文化甚 至整个世界的文化做出很多贡献。本文用 NLTK 提取鲍勃迪伦的歌词中的名词,将他的歌词 进行分词统计存储在一个哈希表中,并用 matplotlib 将出现词频率高的歌词进行可视化。
2. 问题分析
- 在实验的过程中,我们先从 github 中下载鲍勃迪伦的歌词,再在 python 中将歌词文件读入, 用 NLTK 中的函数将之中的名词提取。
- 在得到所有的名词列表后,使用哈希表来对歌词进行词频统计。
- 用哈希表来存储词频是一种很高效的方式,他是根据关键码值可直接访问的数据结构。
在 python 中可以用字典将其实现。当我们要查找该单词的词频时,时间复杂度为 O(1)。 - 在词频统计之后,我们取出字典中名词出现频率最高的前 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. 实验总结
在实验的过程中,碰到了一些问题,比如:
-
关于 python 读文件的操作
解决方案: 使用了 python 下的 os 库 -
得到的数据多是助动词、介词、冠词,相对参考价值较小
解决方案: 对数据进行提取,改变分词策略,只提取歌词中的名词。 -
无法使用 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 的歌词的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!