目录

  • 一、你需要知道的几个常用词典
  • - **停用词典(停用词,颜文字,emoji)**
  • - 否定词典,程度副词词典
  • - 情感极性词典,多维情感词典
  • 二、统一字符、统一大小写、统一繁简体
  • - 统一字符
  • - 统一大小写
  • - 统一繁简体
  • 三、添加无法识别的词和字典中没有的新词
  • 四、代码实现分词


与本文相关内容链接:

  • B站视频《[数说弹幕]我不小心看了后浪弹幕》
  • 关于《后浪》的B站弹幕分析总结(一)——爬取B站视频的上万条弹幕的方法

这一篇内容我着重讲述分词的方法,以及在分词过程中需要注意的点,这里主要使用的工具是jieba分词。前半部分是理论介绍,后半部分是代码,如果对理论很熟悉的可以跳过前半部分。

一、你需要知道的几个常用词典

这个网站有很多词典可以下载使用:https://github.com/fighting41love/funNLP
我在做分词,包括后面的情感分析主要使用的词典是

- 停用词典(停用词,颜文字,emoji)

由于B站弹幕上充满了网络用语和二次元表情,处理起来不是一个简单的停用词表可以解决的。这样你的停用词典就要分成三类,停用词,颜文字((≧ω≦)/,(ω),(∩▽∩),(๑•́ ₃ •̀๑),⊙ω⊙)和emoji

基于snownlp弹幕情感分析论文_大小写


颜文字可以将其拆解为一个个符号进行剔除,如果想保留可以建立自己的颜文字表。

emoji都有对应的Unicode,可以查找他们的编码进行识别处理。

- 否定词典,程度副词词典

《面向微博短文本的情感分析研究》中指出,正向情感类被否定词修饰后,其情感趋向于负向情感类,而负向情感类被否定词修饰后,其情感趋向于无情感,或稍微倾向于正向情感。而程度副词分为两类一类是增强情感,一类是削弱情感。

- 情感极性词典,多维情感词典

情感极性词典将情感分为正向、中性、负向三种。
情感多维词典也就是情绪词典,通常根据七情六欲中的七情将情感分为喜、怒、忧、思、悲、恐、惊,也有更多的划分。具体可以参考微博舆情的情绪模型。

其他的大家可以留言补充。

二、统一字符、统一大小写、统一繁简体

- 统一字符

统一字符,就是将文本内容中的全角字符串转换为半角字符串,这样会避免在自然语言处理的过程中由于字符不统一而导致的信息混乱问题。有规律的字符全角的十进制范围是[65281,65374],半角是[33,126],全角和半角之间的差值为65248,因此我们直接在全角数值上减去65248即可的到半角数值。在转换的过程中使用两个函数:ord和chr,ord是将字符串转换为对应的数值,chr是将数值转换为Unicode字符串。

- 统一大小写

针对英文词组,或者英文缩写,一个英文词组同样的意思因为大小写不一致,会被识别为不同的词组。这里使用upper()函数转换为大写,或者lower()函数转换成小写。

- 统一繁简体

针对中文词组,同样的中文词组,由于繁简体不一致会被识别为不同的词组。
langconv.pyzh_wiki.py 将这两个包下载下来,放在与代码同样的文件夹下,然后倒入。第一个包是用来实现繁体转简体,第二个包是用来实现简体转繁体。

三、添加无法识别的词和字典中没有的新词

因为B站的二次元环境就注定了很多常用词组是在日常生活中没有的,jieba也同样识别不出来,这样就需要我们手动添加,比如”老番茄“,“哔哩哔哩”,“小破站”等。只需要使用jieba.add()函数就可以了。

四、代码实现分词

这里的代码不会将上面说的点都实现,因为有些是同样的逻辑,只是重复工作而已,道理已经讲清楚了,自己实现起来不难。

import jieba #中文分词
import jieba.analyse

添加词组

#添加jieba无法识别的词组,tag用来定义词性
jieba.add_word('哔哩哔哩',tag='nt')
jieba.add_word('老番茄',tag='nr')
jieba.add_word('B站',tag='nt')

读取停用词

#读取停用词典,其他词典同样道理,这里codecs需要import一下
import codecs #用于编码转换
stoplist=[i.strip() for i in codecs.open('stop_words.txt', 'r', 'utf-8').readlines()]

繁体转简体

from langconv import *
import sys
 # 定义转换繁体到简体函数
def cht_to_chs(line):
    line = Converter('zh-hans').convert(line)
    line.encode('utf-8')
    return line

全角转半角

def str_convertU(content):
    strs=[]
    for each_char in content:
        code_num = ord(each_char) 
        if code_num==12288:
            code_num=32
        elif 65281<=code_num<=65374:
            code_num-=65248
        strs.append(chr(code_num))
    return ''.join(strs)

结巴分词

def jieba_cut(text):
    words=pseg.cut(text)
    rule_word=['z','vn','v','t','nz','nr','ns','n','nt','l','i','j','an','a','eng']
    seg_list=[word.word.upper() for word in words if word.flag in rule_word]
    cov_list=[cht_to_chs(word) for word in seg_list if word not in stoplist]
    return cov_list
words_list=[jieba_cut(each_content) for each_content in df]

在下一篇文章我会介绍制作词云的几个方法,敬请期待。