分词和词向量

  • 数据整理
  • jieba分词
  • 不同分词模式
  • 自定义词典
  • 不足
  • 去停用词
  • 热点事件自动识别
  • 基于词向量的固定表征
  • Word2Vec模型(不足:只利用了局部信息)
  • GloVe(改良:能利用全局信息)


数据整理

jieba分词

(附上参考链接,里面有很多测试样例)

不同分词模式

NLP 分词 科普 nlp分词模型_字符串


主要围绕两个函数:jieba.cut(), jieba.cut_for_search()jieba.cut()

第一个参数是需要进行分词的字符串。

第二个参数控制是否启用全模式:

若启用,参数为“cut_all=True”,表示选择全模式。特征:词之间会有重复的部分,从最短词到仍具有完整语义的最长词都会打印出来。

若缺省或选择 False ,则表示选择精确模式。特征:无重复,从左到右呈现具有完整语义的最长词。

jieba.cut_for_search()

参数是需要进行分词的字符串。搜索引擎模式特征:词之间有重复的部分,会呈现相邻之间能组成的有完整语义的词,最短词到最长词都有。

NLP 分词 科普 nlp分词模型_NLP 分词 科普_02


NLP 分词 科普 nlp分词模型_滑动窗口_03

自定义词典

NLP 分词 科普 nlp分词模型_滑动窗口_04

不足

测试的时候发现它识别不出完整的成语:

NLP 分词 科普 nlp分词模型_NLP 分词 科普_05

去停用词

首先需要下载些停用词的文本,GitHub上都有,我下的是百度、哈工大、川大的停用词文本。 具体操作学习的是这篇博客。 进行停用词的去除,需要先加载停用词:

path3 = "D:/stopwords_u.txt"    #停用词txt
stopwords = [line.strip() for line in open(path2, encoding="utf-8").readlines()] #加载停用词

继而可以根据停用词进行储存和词频统计:

words = jieba.lcut(txt)     #前一步的分词
counts = {}                 #计数{word,frequency}
for word in words:
    if word not in stopwords:          #不在停用词表中
        if len(word) == 1:        #长度为1的话,不储存
            continue
        else:                #不是停用词且词长度不为1
            counts[word] = counts.get(word, 0) + 1 #词均用数组下标进行标识

热点事件自动识别

(附上参考的论文) 该论文主要从突发词识别(采用加权突发词聚类算法)的基础出发,再在对应时间窗上识别对应热点事件、测度热度值等。

首先初始化为0-1矩阵:

NLP 分词 科普 nlp分词模型_字符串_06


不断进行迭代运算类间相似性,同时合并相似性最大的两个子类,直到满足终止条件。

NLP 分词 科普 nlp分词模型_滑动窗口_07


最终能得到一定时间内权重最大或较大的词,继而可以据此实现热点事件的进一步识别。

该论文还涉及到一些惩罚函数等式子,目前还没看懂…

基于词向量的固定表征

(附上参考链接) 在前一步的分词中已经把数据集分成各个具有完整语义的词。为了分析出该数据集的整体感情色彩,需要分析这些词。方法有词频统计、概率统计等。尤其是相近语义或类型的词,是否把它们归为一类,在文中不同地方出现语义是否会有所变化,这些都会影响分析结果的准确性。这时利用词向量间的运算(求余弦等)可以计算出相对应的值,可用于分析计算对应词的属性。

Word2Vec模型(不足:只利用了局部信息)

(附上学习链接) 这个模型主要通过滑动窗口的方式进行多次输入输出,以完善一个较为准确的词向量。如下,每次取窗口中前两个词进行输入,在词向量表中经过计算后,更新第三个词的向量值(即输出后的词向量表已被更新)。

NLP 分词 科普 nlp分词模型_滑动窗口_08


视频中还提到两种具体的方式:

一是取窗口中间的词作为要输出的词。(多对一)

NLP 分词 科普 nlp分词模型_滑动窗口_09


二是取中间的词作为输入,其余的分别作输出。(一对多)

NLP 分词 科普 nlp分词模型_NLP 分词 科普_10


(这些窗口滑动计算的过程也是深度学习的过程)此外,为提高准确性,该预处理模型还需要加入一些负样本,以在计算的过程中将词向量表更新得更准确和符合原文本。如下,根据选好的滑动窗口中的词,规定当输出词不是原窗口中该输出的词的时候,得到的结果为0.

NLP 分词 科普 nlp分词模型_滑动窗口_11

GloVe(改良:能利用全局信息)

参考了大佬的博客b站上的视频

首先需要建立一个n×n的共现矩阵(词汇表×词汇表),全部初始化为0,表示这些词之间尚未有联系。

接着用滑动窗口的方法统计词i与词j的共现次数。共现矩阵构建好后变可计算共现频率:

NLP 分词 科普 nlp分词模型_字符串_12


进一步计算共现频率比:

NLP 分词 科普 nlp分词模型_NLP 分词 科普_13


在此基础上优化词向量函数:

NLP 分词 科普 nlp分词模型_字符串_14


最后据此确定一个加权函数:

NLP 分词 科普 nlp分词模型_NLP 分词 科普_15