马老师第二弹–弹幕到底说了什么

导言

在被人民日报被评价为”哗众取宠”后,bilibili下架了所有的马老师的视频。我之前爬取的视频历史弹幕竟成了这一段时间的唯一记录。这可以查看之前的文章:用BeautifulSoup爬取BiliBili视频的历史弹幕

这篇文章计算最多弹幕出现的次数是以每条弹幕完全一致作为标准的,即当弹幕历史中两条弹幕完全一致时(包括标点符号),才会被统计为两次出现。
例如:
年轻人 不讲武德年轻人不讲武德是要被计算为不同词条的。为了解决这个问题,需要分词。

碰巧遇到了jieba这一对中文进行分词的Python第三方库,为了探究网友究竟说了什么,再来亿遍。

jieba库介绍

中文名:“结巴”, 是Python 的中文分词组件,即将中文的自然语言分解为合适的词语(主谓宾,常用词语等)。
举个例子

import jieba

strs=["我来到北京清华大学","乒乓球拍卖完了","中国科学技术大学"]
for str in strs:
    seg_list = jieba.cut(str)
    print('/'.join(list(seg_list)))

seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  # 精确模式

seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
print(", ".join(seg_list))

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
print(", ".join(seg_list))
  我/来到/北京/清华大学
  乒乓球/拍卖/完/了
  中国/科学技术/大学

【全模式】: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学

【精确模式】: 我/ 来到/ 北京/ 清华大学

【新词识别】:他, 来到, 了, 网易, 杭研, 大厦

【搜索引擎模式】: 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造

项目地址githubhttps://github.com/fxsjy/jieba

安装pip install jieba

特点

  • 支持三种分词模式:
  • 精确模式,试图将句子最精确地切开,适合文本分析;
  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
  • 支持繁体分词
  • 支持自定义词典

进入正题

导入模块

import jieba
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.family'] = ['Arial Unicode MS']

分词及绘图

def plot(filename):
    txt = open(filename+'.txt', "r", encoding='utf-8').read()
    words = jieba.lcut(txt)
    counts = {}
    for word in words:
        if len(word) == 1:
            continue
        else:
            counts[word] = counts.get(word, 0) + 1

    items = list(counts.items())
    items.sort(key=lambda x: x[1], reverse=True)

    plt.figure(figsize=(8,8))
    sns.barplot(y=[i[0] for i in items][:20],x=[i[1] for i in items][:20])
    plt.title(filename+'弹幕')
    plt.tight_layout()
    plt.savefig(filename+'_split.png')

入口

if __name__ == '__main__':
    name = 'TeacherMa'
    plot(name)

结果

23653个词语。
绘图后,发现词语已被正确分开。

但其实有个问题,耗子尾汁被分开了,对于玩梗的,对于某些词语还是要连在一起的。jieba有个自定义添加词典的函数add_words(),可以讲未知的词语添加到词典库中。在增加耗子尾汁有bear来等后,结果变成了这样。

if __name__ == '__main__':
    jieba.add_word('耗子尾汁')
    jieba.add_word('有bear来')
    jieba.add_word('不讲武德')
    jieba.add_word('色狼啵千金')
    jieba.add_word('我大E了')
    name = 'TeacherMa'
    plot(name)

这样就合理多了。

同样地,对于另一个视频的记录来讲,结果也类似。
增加自定义字典前:

增加自定义字典后:

结论

分词是自然语言的第一步,将文本转换为基本的单词矩阵,对于以后的文本分类(可以看这里:如何建立一个基于TF-INF的文本分类器),主题模型有重要意义。

Categories: Python

0 Comments

Leave a Reply

Your email address will not be published.