利用python数据结构(list, dict, set等)完成简单的文本分析任务。

弹幕是现下视频网站,尤其是短视频网站提供的关键功能之一。以B站为例,其有着特殊的弹幕文化,且在视频的不同部分往往会有不同话题的弹幕:比如在视频开头会出 现“来啦”“x小时前”“第一!”;在up主暗示一键三连之后常常会出现“下次一定”或者“你币有 了”;和up主建立默契之后,观众可以判断视频是否有恰饭,往往在广告之前会出现“要素察 觉”“恰饭”“快跑”等等。因此,弹幕经常被作为测度用户(viewer)与视频作者(up主)之间交互行为的关键数据。本次作业提供的数据来自B站某知名up主,已上传至课程资料的data目录下,数据格式说明如下。 a. 弹幕文件:danmuku.csv,为2799000 rows × 3 columns,本次作业仅使用第一列,即弹幕的文本内容。 b . 停用词表示例,stopwords_list.txt 请大家尝试完成以下数据分析任务:

1. 使用danmuku.csv,其中一个弹幕可以视为一个文档(document),读入文档并分词(可以使用jieba或pyltp)。

2. 过滤停用词(可用stopwords_list.txt,或自己进一步扩充)并统计词频,输出特定数目的高频词和低频词进行观察。建议将停用词提前加入到jieba等分词工具的自定义词典中,避免停用词未被正确分词。

3. 根据词频进行特征词筛选,如只保留高频词,删除低频词(出现次数少于5之类),并得到特征词组成的特征集。

4. 利用特征集为每一条弹幕生成向量表示,可以是0,1表示(one-hot,即该特征词在弹幕中是否出现)也可以是出现次数的表示(该特征词在弹幕中出现了多少次)。注意,可能出现一些过短的弹幕,建议直接过滤掉。

5. 利用该向量表示,随机找几条弹幕,计算不同弹幕间的语义相似度,可尝试多种方式,如欧几里得距离或者余弦相似度等,并观察距离小的样本对和距离大的样本对是否在语义上确实存在明显的差别。请思考,这种方法有无可能帮助我们找到最有代表性的弹幕?

6. (附加)能不能对高频词(如top 50之类)进行可视化呈现(WordCloud包)?

7. (附加)能不能考虑别的特征词构建思路,如常用的TF-IDF,即一方面词的频率要高,另一方面,词出现的文档数越少越好,观察其与仅利用词频所得的结果有何差异,哪个更好?

8. (附加)了解一下word2vec等深度学习中常用的词向量表征(如gensim和pyltp中均有相关的库),并思考如果用这种形式的话,那么一条弹幕会被表示成什么形式?弹幕之间计算相似性的时候,会带来哪些新的问题?

注意:不要使用jieba等库中提供的函数实现特征词抽取和文档表示,要求自己使用相关数据结构来实现;要通过函数对代码进行封装,并在main函数中调用。

目录

一、完整代码

⼆、各功能实现

1.只导⼊⽂件前200⾏时词频的结果

2.计算随机两个向量的距离

3.使⽤TF_IDF统计词频,并且绘制词云图

三、对于封装函数的解释

1.初始模块的导⼊

2.Restopwords(): 读⼊停⽤词,返回⼀个停⽤词列表

3.Comments_lines(): 将评论的数据集读⼊并返回已每条弹幕为元素

4.Word_frequ(rows,stopwords): 统计词频函数

5.Screen(counts): 筛选词频函数

6.Matrix(counts1,rows): 为每⼀条弹幕⽣成向量函数

7.Distance(n,matrics): 计算随机两个弹幕之间余弦距离和欧式距离

8.plot_Wc(counts1): 传⼊词频字典绘制词云图

9.TF_IDF(counts1,rows):

10.主函数


一、完整代码

import jieba
import csv
import random
import math
import wordcloud
import matplotlib.pyplot as pltdef Restopwords():''' 读取停用词函数'''with open("D:\学习文件\大三上\现代程序设计\第一次作业\dataset\stopwords_list.txt",'r',encoding='utf-8') as f:stopwords = f.read().splitlines()  #用splitlines()函数 将读取的每一行作为一个元素存入列表stopwords中return stopwords  #返回停用词列表def Comments_lines():'''读取数据集的函数'''with open("D:\学习文件\大三上\现代程序设计\第一次作业\dataset\danmuku.csv","r",encoding='utf-8') as f:reader = csv.reader(f)  #使用reader()函数,将整个数据集每行作为一个元素,存入reader列表rows= [row[0] for row in reader]  #对reader进行遍历,只取第一列弹幕作为元素rows = rows[0:5000]return rows   #返回已每条弹幕作为元素的列表def Word_frequ(rows,stopwords):'''这是一个统计词频的函数'''coms = []  #这是一个承接所有词组的列表for row in rows:  #对每条弹幕进行遍历com = jieba.lcut(row)  #使用jieba库进行分词coms.extend(com)  #将所有分出的词组加入coms列表counts = {} #这是一个统计词频的字典for word in coms:  #对每个词进行遍历if len(word) == 1: #不使用单字作为一个词continueelif word in stopwords: #在停用词列表中的剔出continueelse:counts[word] = counts.get(word, 0) + 1  #如果该词在字典中存在,则值再加1,要是不存在就创建一个return counts       def Screen(counts):'''这是一个筛选词频的函数'''items = list(counts.items()) #将之前的词频字典转化为元组为元素的列表items1 = items[:]for i in items1:#如果词频小于5就将其删除if i[1] <= 5:  items.remove(i)counts1 = dict(items)return counts1def Matrix(counts1,rows):'''这是一个根据弹幕生成向量矩阵的函数'''matrics = []n = len(counts1)items = list(counts1.keys())for row in rows:  #对每条弹幕进行遍历  words = jieba.lcut(row) #对一条弹幕进行分词if len(words) <=7:  #如果一条弹幕总词组数量小于7,则不计入矩阵passelse:#找到对于单词对应的位置,在该位置设置标记lis = [0]*nfor word in words:if word in items:lis[items.index(word)] = 1 matrics.append(lis)return matrics,ndef Distance(n,matrics):'''这是一个计算不同弹幕距离的函数'''sums = 0mole = 0#随机找出矩阵中的两个向量for i in range(n):x = random.randint(0,10)y = random.randint(0,10)sums = (matrics[x][i] - matrics[y][i])**2 + sumsmole = mole + matrics[x][i]*matrics[y][i]# 计算欧式距离distance_euc = math.sqrt(sums)sum1 = sum(matrics[x]);sum2 = sum(matrics[y])deno = math.sqrt(sum1*sum2)#计算余弦距离if deno == 0:distance_cos = 0else:distance_cos = mole/deno    return distance_euc,distance_cos    def plot_Wc(counts1):'''这是将词频字典生成词云的函数'''#主结构很像前端里面CSS的写法wc = wordcloud.WordCloud(             #根据词频字典生成词云图max_words=100,  # 最多显示词数max_font_size=300,  # 字体最大值background_color="white",  # 设置背景为白色,默认为黑色width = 1500,  # 设置图片的宽度height= 960,  # 设置图片的高度margin= 10,  # 设置图片的边缘font_path='C:/Windows/Fonts/simsun.ttc')wc.generate_from_frequencies(counts1)  # 从字典生成词云plt.imshow(wc)  # 显示词云plt.axis('off')  # 关闭坐标轴plt.show()  # 显示图像def TF_IDF(counts1,rows):'''对TF_IDF进行构建'''n = len(counts1)m = len(rows)counts_IF = counts1for i in counts1:#计算tftf = counts1.get(i)/ncount = 0for row in rows:words = jieba.lcut(row)if i in words:count = count + 1#计算idfidf = math.log(m/count)#两者求积得tf_idftf_idf = tf*idfcounts_IF[i] = tf_idfreturn counts_IFdef main():'''这是主函数对之前定义的函数进行调用'''stopwords = Restopwords() #停用词列表rows = Comments_lines()  #弹幕列表counts = Word_frequ(rows,stopwords)  #词频列表counts1 = Screen(counts)#matrics,n = Matrix(counts1,rows)#distance_euc,distance_cos = Distance(n,matrics)counts_IF = TF_IDF(counts1,rows)print(counts_IF)plot_Wc(counts1)if __name__ == '__main__':main()

⼆、各功能实现

1.只导⼊⽂件前200⾏时词频的结果

导⼊全⽂件的词频结果

2.计算随机两个向量的距离

3.使⽤TF_IDF统计词频,并且绘制词云图

三、对于封装函数的解释

1.初始模块的导⼊

2.Restopwords(): 读⼊停⽤词,返回⼀个停⽤词列表

主要的难点在于splitlines()函数的实现

3.Comments_lines(): 将评论的数据集读⼊并返回已每条弹幕为元素

的列表

使⽤ [row[0] for row in reader] 来只获取第⼀列数据

4.Word_frequ(rows,stopwords): 统计词频函数

注意 jieba.lcut()函数的使⽤ 和 counts[word] = counts.get(word, 0) + 1 对于词频的统计
使⽤的if函数对词组是否在停⽤词中进⾏了判断
返回了⼀个词频字典

5.Screen(counts): 筛选词频函数

使⽤了list()函数和dict()函数,来实现列表和字典之间的相互转化邱骏坤 20377242 词频分析作业
8
返回了⼀个词频都⼤于5的词频字典

6.Matrix(counts1,rows): 为每⼀条弹幕⽣成向量函数

这⾥使⽤ if len(words) <=7:
pass
来将过短的弹幕删除
将会返回⼀个⼆维数组矩阵和向量的⻓度

7.Distance(n,matrics): 计算随机两个弹幕之间余弦距离和欧式距离

余弦距离计算公式:

欧式距离计算公式:

8.plot_Wc(counts1): 传⼊词频字典绘制词云图

9.TF_IDF(counts1,rows):

10.主函数

Python——弹幕词频统计及其文本分析(绘制词云)(含源代码)相关推荐

  1. r语言上机文本分析与词云绘制_倚天屠龙记的文本分析

    <倚天屠龙记>作为金庸先生的经典作品,在无数人心目中留下了深刻的印象,基本上隔一段时间这部经典作品就会被重新拍成电影或者电视剧,可见观众的喜爱程度.虽然本人没有完完全全拜读过先生的这部作品 ...

  2. python jieba词频统计英文文本_python实战,中文自然语言处理,应用jieba库来统计文本词频...

    模块介绍 安装:pip install jieba 即可 jieba库,主要用于中文文本内容的分词,它有3种分词方法: 1. 精确模式, 试图将句子最精确地切开,适合文本分析: 2. 全模式,把句子中 ...

  3. https open api_通过bilibili_api获取弹幕+绘制词云的方法

    刚接触python 随手做一些自己感兴趣的项目,看到了一个通过bilibili_api三行代码获取弹幕的教程(vx公号:天作之程(jhtmtzzc))使用的是bilibili_api ,是2020年1 ...

  4. python 英语词频统计软件_Python数据挖掘——文本分析

    作者 | zhouyue65 来源 | 君泉计量 文本挖掘:从大量文本数据中抽取出有价值的知识,并且利用这些知识重新组织信息的过程. 一.语料库(Corpus) 语料库是我们要分析的所有文档的集合. ...

  5. 【Python】文本情感分析及绘制词云

    码字不易,喜欢请点赞!!! 这篇文章主要分享了使用Python来对文本数据进行情感分析以及绘制词云. 主要步骤包括: 1.文本预处理 2.文本分词 3.去除停用词(这里设置为单个词和一些常见的停用词) ...

  6. python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

    目录 1 需要导入的模块 2 中文分词基础步骤 2.1 载入数据 2.2 分词 2.3 分词后的数据转回文本 2.4 保存分词后的文本为文本文件 3 添加自定义词典 3.1 方法1:直接定义词典列表 ...

  7. Python英文词频统计(哈姆雷特)程序示例

    今天继续给大家介绍Python相关知识,本文主要内容是Python英文词频统计程序示例,主要是对英文文本--<哈姆雷特>进行分词. 一.英文文本词频统计思路 想要对<哈姆雷特> ...

  8. 《延禧攻略》演员大起底——利用Python+bs+pyecharts分析绘制词云和玫瑰图

    最近大火的电视剧<延禧攻略>已宣告大结局,除了剧情走心,演员的那些头花啊头饰啊,戏服也都精致无比.本文利用Python抓取互联网上演员的部分数据,分析演员的姓名.星座.身高.体重和籍贯等信 ...

  9. 个人项目(词频统计及其效能分析)

    1. 博客开头给出自己的基本信息,格式建议如下:   学号:2017*****7212:   姓名:张佳欢;   码云项目仓库:https://gitee.com/zhangjiahuan123456 ...

  10. 使用Python做中文分词和绘制词云

    使用Python做中文分词和绘制词云 李小璐出轨云词图 作为一门编程语言,Python的编写简单,支持库强大,应用场景多,越来越多的人开始将它作为自己的编程入门语言. Python一个比较重要的场景是 ...

最新文章

  1. 用D3.js 十分钟实现字符跳动效果
  2. pycharm禁用pytest
  3. ExtJS 动态增加与删除items,动态设置textField可见与否
  4. Spring-学习笔记06【spring_day02资料_dbutils】
  5. python中参数传递_python中参数传递
  6. chromium笔记目录
  7. 教你快速打粤语正字 讯飞输入法语音输入1分钟400字
  8. 假设检验基本思想与步骤
  9. 我用Python爬取美食网站3032个菜谱并分析,真香!
  10. python读取歌词文本,并显示在图片上,制作视频
  11. 关于(archive)归档和(unarchive)解档的处理。
  12. 用C#编写一个图片浏览器,实现鼠标控制图片的平移缩放与图片的灰度化
  13. 【Vue.js 3.0源码】KeepAlive 组件:如何让组件在内存中缓存和调度?
  14. 大脑和小脑——规划和执行
  15. 杰里695N系列(soundbox)之 2.1-APP消息管理
  16. 将网站上的信托计划净值数据写入excel,涉及dataframe排序,转换数据类型,列表填入dataframe,取小数点后四位的正则,dataframe生成excel
  17. HC32L110国产超低功耗华大MCU芯片介绍
  18. 设某一个班共有N(N=20)名学生,期末考试5门课程,请编一程序评定学生的奖学金,要求打印输出一、二等奖学金学生的学号、姓名和各门课成绩。
  19. 工单内容的三个层级分类
  20. 【Arcgis】基于泰森多边形求流域面降水量

热门文章

  1. 区块链符号理论:符号方案和符号系统
  2. 8类网线利弊_网线标准(从一类线到八类线)
  3. 两台电脑的文件共享方式
  4. Flink1.13 DataStream API - Event Time - Generating Watermarks
  5. 3dmax实例教程-使用3ds Max 创建一个完整的场景
  6. 用python孵一颗彩蛋,今日份来自程序员的浪漫
  7. 微信小程序简单爱心点赞动画
  8. 显著性检验--学习笔记
  9. Camera和Image sensor技术基础笔记(2) -- Sensor的快门:全局快门(global shutter)和卷帘快门(rolling shutter)
  10. 详细图解,一眼就能看懂!卷帘快门(Rolling Shutter)与全局快门(Global Shutter)的区别