1.非结构化数据转换为词袋和词向量模型

文本数据(非结构化数据)转换成计算机能够计算的数据。有两种常用的模型:词袋和词向量模型。

2.词袋模型(Bag of Words Model)

词袋模型看起来好像一个口袋把所有词都装进去,但却不完全如此。在自然语言处理和信息检索中作为一种简单假设,词袋模型把文本(段落或者文档)被看作是无序的词汇集合,忽略语法甚至是单词的顺序,把每一个单词都进行统计,同时计算每个单词出现的次数,常常被用在文本分类中,如贝叶斯算法、LDA 和 LSA 等。

对于 for 循环多次直接用到列表推导式。在 Python 中,列表推导式的效率比 for 快很多,尤其在数据量大的时候效果更明显.

2.1 使用jieba进行词袋化

import jieba
#定义停用词、标点符号
punctuation = [",","。", ":", ";", "?"]
#定义语料
content = ["机器学习带动人工智能飞速的发展。","深度学习带动人工智能飞速的发展。","机器学习和深度学习带动人工智能飞速的发展。"]
# 对语料进行分词
segs_1 = [jieba.lcut(con) for con in content]
print(segs_1)#去掉停止词
tokenized = []
for sentence in segs_1:words = []for word in sentence:if word not in punctuation:words.append(word)tokenized.append(words)
print("\n去除停止词后:",tokenized)
# 把所有的分词结果放到一个袋子(List)里面,也就是取并集,再去重,获取对应的特征词。
#求并集
bag_of_words = [ x for item in segs_1 for x in item if x not in punctuation]
print(bag_of_words)#去重
bag_of_words = list(set(bag_of_words))
print(bag_of_words)
# 以去重后的特征词顺序和去除停止词后的分词进行词袋化
bag_of_word2vec = []
for sentence in tokenized:tokens = [1 if token in sentence else 0 for token in bag_of_words ]bag_of_word2vec.append(tokens)
print(bag_of_word2vec)

词袋数据可作为分类/预测/深度模型 的输入数据。

2.2 Gensim 构建词袋模型

import jieba
#定义停用词、标点符号
punctuation = [",","。", ":", ";", "?"]
#定义语料
content = ["机器学习带动人工智能飞速的发展。","深度学习带动人工智能飞速的发展。","机器学习和深度学习带动人工智能飞速的发展。"]
# 对语料进行分词
segs_1 = [jieba.lcut(con) for con in content]
print(segs_1)#去掉停止词
tokenized = []
for sentence in segs_1:words = []for word in sentence:if word not in punctuation:words.append(word)tokenized.append(words)
print("\n去除停止词后:",tokenized)
from gensim import corpora
import gensim
#tokenized是去标点之后的
dictionary = corpora.Dictionary(tokenized)#保存词典到内存中
dictionary.save('deerwester.dict')
# dictionary2 = corpora.Dictionary.load('deerwester.dict')#加载词典print(dictionary)print(dictionary.token2id)
# 函数 doc2bow(),作用只是计算每个不同单词的出现次数,将单词转换为其整数单词 id 并将结果作为稀疏向量返回。corpus = [dictionary.doc2bow(sentence) for sentence in segs_1]
print(corpus )

词袋数据可作为分类/预测/深度模型 的输入数据。

3.词向量 (Word Embedding)

深度学习带给自然语言处理最令人兴奋的突破是词向量(Word Embedding)技术。词向量技术是将词语转化成为稠密向量。在自然语言处理应用中,词向量作为机器学习、深度学习模型的特征进行输入。因此,最终模型的效果很大程度上取决于词向量的效果。

给词向量一个定义,词向量就是要用某个固定维度的向量去表示单词。也就是说要把单词变成固定维度的向量,作为机器学习(Machine Learning)或深度学习模型的特征向量输入。

3.1 Word2Vec

这个模型是如何定义数据的输入和输出呢?一般分为CBOW(Continuous Bag-of-Words 与Skip-Gram两种模型。CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。 Skip-Gram模型和CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。

  • 过程:

    • 查看相关模型:词袋,Word2Vec,Doc2Vec【查文档】
    • 加载并预处理训练和测试语料库(请参阅语料库)
    • 使用训练语料库训练Word2Vec模型模型
    • 演示如何将训练后的模型用于推断向量
    • 评估模型
    • 在测试语料库上测试模型

Word2Vec解决了词袋模型的第二个缺点(词袋模型不会尝试学习基础单词的含义。)。

Word2Vec是一种较新的模型,该模型使用浅层神经网络将单词嵌入到低维向量空间中。结果是一组词向量,其中在向量空间中靠在一起的向量根据上下文具有相似的含义,而彼此远离的词向量具有不同的含义。例如,strong和powerful会彼此靠近,strong并且Paris会相对较远。Word2Vec模型,我们可以计算文档中每个单词的向量。

该模型有两个版本,并且Word2Vec 类同时实现了这两个版本:

  • Skip-grams (SG)【已知中心词预测周围词。】
  • Continuous-bag-of-words连续词袋(CBOW)【已知周围词预测中心词。】
from gensim.models import Word2Vec
import jieba
#定义停用词、标点符号
punctuation = [",","。", ":", ";", ".", "'", '"', "’", "?", "/", "-", "+", "&", "(", ")"]
sentences = [
"长江是中国第一大河,干流全长6397公里(以沱沱河为源),一般称6300公里。流域总面积一百八十余万平方公里,年平均入海水量约九千六百余亿立方米。以干流长度和入海水量论,长江均居世界第三位。",
"黄河,中国古代也称河,发源于中华人民共和国青海省巴颜喀拉山脉,流经青海、四川、甘肃、宁夏、内蒙古、陕西、山西、河南、山东9个省区,最后于山东省东营垦利县注入渤海。干流河道全长5464千米,仅次于长江,为中国第二长河。黄河还是世界第五长河。",
"黄河,是中华民族的母亲河。作为中华文明的发祥地,维系炎黄子孙的血脉.是中华民族民族精神与民族情感的象征。",
"黄河被称为中华文明的母亲河。公元前2000多年华夏族在黄河领域的中原地区形成、繁衍。",
"在兰州的“黄河第一桥”内蒙古托克托县河口镇以上的黄河河段为黄河上游。",
"黄河上游根据河道特性的不同,又可分为河源段、峡谷段和冲积平原三部分。 ",
"黄河,是中华民族的母亲河。"
]# 去标点符号(注:这里并没用进行去除停止词,完整的步骤应包括去除停止词)
sentences = [jieba.lcut(sen) for sen in sentences]
tokenized = []
for sentence in sentences:words = []for word in sentence:if word not in punctuation:          words.append(word)tokenized.append(words)
# print(sentences)
print(tokenized)
# 增加ID: 当然,也可以不进行此步骤,因为列表本身就有下标索引。
# from gensim import corpora
# dictionary = corpora.Dictionary(tokenized)
# print(dictionary)
# print(dictionary.token2id)
#
"""
sg=1 是 skip-gram 算法,对低频词敏感;默认 sg=0 为 CBOW 算法。
size 是输出词向量的维数,值太小会导致词映射因为冲突而影响结果,值太大则会耗内存并使算法计算变慢,一般值取为100到200之间。
window 是句子中当前词与目标词之间的最大距离,3表示在目标词前看3-b 个词,后面看 b 个词(b 在0-3之间随机)。
min_count 是对词进行过滤,频率小于 min-count 的单词则会被忽视,默认值为5。
negative 和 sample 可根据训练结果进行微调,sample 表示更高频率的词被随机下采样到所设置的阈值,默认值为 1e-3。
hs=1 表示层级 softmax 将会被使用,默认 hs=0 且 negative 不为0,则负采样将会被选择使用。
"""
model = Word2Vec(tokenized, sg=1, size=100,  window=5,  min_count=2,  negative=1, sample=0.001, hs=1, workers=4)
model.save('model')  #保存模型
model = Word2Vec.load('model')   #加载模型
# 模型训练好之后,接下来就可以使用模型,可以用来计算句子或者词的相似性、最大匹配程度等。print(model.similarity('黄河', '黄河')) #黄河和黄河自己的相似度
print(model.similarity('黄河', '长江'))#黄河和长江的相似度
# 预测最接近的词,预测与黄河和母亲河最接近,而与长江不接近的词:注:返回的每个词后面是相似度大小
print(model.most_similar(positive=['黄河', '母亲河'], negative=['长江']))# [(词语,相似度大小),(词语,相似度大小),(词语,相似度大小),(词语,相似度大小),]就作为一个可以替代原来的词袋模型的训练数据。

3.2 Doc2Vec

Doc2Vec 是 Mikolov 在 Word2Vec 基础上提出的另一个用于计算长文本向量的工具。在 Gensim 库中,Doc2Vec 与 Word2Vec 都极为相似。但两者在对输入数据的预处理上稍有不同,Doc2vec 接收一个由 LabeledSentence 对象组成的迭代器作为其构造函数的输入参数。其中,LabeledSentence 是 Gensim 内建的一个类,它接收两个 List 作为其初始化的参数:word list 和 label list。

Doc2Vec 也包括两种实现方式:DBOW(Distributed Bag of Words)和 DM (Distributed Memory)。DBOW 和 DM 的实现,二者在 gensim 库中的实现用的是同一个方法,该方法中参数 dm = 0 或者 dm=1 决定调用 DBOW 还是 DM。Doc2Vec 将文档语料通过一个固定长度的向量表达。

  • 过程:

    • 查看相关模型:词袋,Word2Vec,Doc2Vec【查文档】
    • 加载并预处理训练和测试语料库(请参阅语料库)
    • 使用训练语料库训练Doc2Vec模型模型
    • 演示如何将训练后的模型用于推断向量
    • 评估模型
    • 在测试语料库上测试模型

Word2Vec模型可以计算文档中每个单词的向量。但是,如果我们要为整个文档计算一个向量,该怎么办?我们可以对文档中每个单词的向量进行平均-尽管这是快速而粗略的,但它通常很有用。但是,有更好的方法…那就是Doc2Vec,基本思想是:就像文档中有另一个像单词一样的浮动单词矢量一样起作用,它有助于所有训练预测,并且像其他单词矢量一样进行更新,但是我们将其称为doc矢量。

  • Doc2Vec有两种实现:

    • 段落向量-分布式内存(PV-DM)
    • 段落向量-单词分布袋(PV-DBOW)
for c in tokenized:print(c)
#定义数据预处理类,作用是给每个文章添加对应的标签
from gensim.models.doc2vec import Doc2Vec,LabeledSentence
doc_labels = ["长江","黄河","黄河","黄河","黄河","黄河","黄河"]
punctuation = [",","。", ":", ";", "?"]#定义语料class LabeledLineSentence(object):def __init__(self, doc_list, labels_list):self.labels_list = labels_listself.doc_list = doc_listdef __iter__(self):for idx, doc in enumerate(self.doc_list):yield LabeledSentence(words=doc,tags=[self.labels_list[idx]])# model = Doc2Vec(content,dm=1, size=100, window=8, min_count=5, workers=4)
# model.save('model')
# model = Doc2Vec.load('model')
# 上面定义好了数据预处理函数,我们将 Word2Vec 中分词去标点后的数据,进行转换:
iter_data = LabeledLineSentence(tokenized, doc_labels)
# 定义模型参数
model = Doc2Vec(dm=1, size=100, window=8, min_count=5, workers=4)
model.build_vocab(iter_data)
# 训练模型, 设置迭代次数1000次,start_alpha 为开始学习率,end_alpha 与 start_alpha 线性递减
model.train(iter_data,total_examples=model.corpus_count,epochs=1000,start_alpha=0.01,end_alpha =0.001)
#根据标签找最相似的,这里只有黄河和长江,所以结果为长江,并计算出了相似度
print(model.docvecs.most_similar('黄河'))# 对黄河和长江标签做相似性计算:
print(model.docvecs.similarity('黄河','长江'))

3.3 Fasttext

gensim 中Fasttext 模型架构和Word2Vec的模型架构差几乎一样,只不过在模型词的输入部分使用了词的n-gram的特征。这里需要讲解一下n-gram特征的含义。举个例子,如果原词是一个很长的词:你吃了吗。jieba分词结果为[“你”,“吃了”,“吗”]。

  • unigram(1-gram)的特征:[“你”,“吃了”,“吗”]
  • bigram(2-gram) 的特征: [“你吃了”,“吃了吗”]

所以发现没,n-gram的意思将词中连续的n个词连起来组成一个单独的词。
如果使用unigram和bigram的特征,词的特征就会变成:[“你”,“吃了”,“吗”,“你吃了”,“吃了吗”]这么一长串。使用n-gram的词向量使得Fast-text模型可以很好的解决未登录词(OOV——out-of-vocabulary)的问题。

8.词袋和词向量模型相关推荐

  1. 第05课:面向非结构化数据转换的词袋和词向量模型

    通过前面几个小节的学习,我们现在已经学会了如何获取文本预料,然后分词,在分词之后的结果上,我们可以提取文本的关键词查看文本核心思想,进而可以通过可视化技术把文档从视觉的角度表达出来. 下面,我们来看看 ...

  2. 情感分析的描述、基于词袋模型和word2vec模型的情感分析实现

    情感分析的描述.基于词袋模型和word2vec模型的情感分析实现 以购物评论为例: # 读入原始数据集 import pandas as pddfpos = pd.read_excel('../dat ...

  3. java构建词性词袋_词袋模型

    词袋模型(英语:Bag-of-words model)是个在自然语言处理和信息检索(IR)下被简化的表达模型.此模型下,一段文本(比如一个句子或是一个文档)可以用一个装着这些词的袋子来表示,这种表示方 ...

  4. sklearn TfidfVectorizer、CountVectorizer词袋、 TfidfTransformer词频模型区别及词表、idf获取、cosine计算、bm25相关性

    #搜索query与docs,词表.idf获取.cosine计算 import pandas as pd import numpy as np from sklearn.feature_extracti ...

  5. NLP_BoW(词袋)模型介绍

    BoW模型 Bag-of-words model (BoW model) 最早出现在自然语言处理(Natural Language Processing)和信息检索(Information Retri ...

  6. 词袋模型和TF-IDF

    作者|PURVA HUILGOL 编译|VK 来源|Analytics Vidhya 机器理解文本的挑战 "语言是一种极好的交流媒介" 你和我很快就会明白那句话.但机器根本无法处理 ...

  7. 词袋模型(BOW,bag of words)和词向量模型(Word Embedding)理解

    Word2vec 向量空间模型在信息检索中是众所周知的,其中每个文档被表示为向量.矢量分量表示文档中每个单词的权重或重要性.使用余弦相似性度量计算两个文档之间的相似性. 尽管对单词使用矢量表示的想法也 ...

  8. 文本深度表示模型——word2vecdoc2vec词向量模型(转)

    from: https://www.cnblogs.com/maybe2030/p/5427148.html 阅读目录 1. 词向量 2.Distributed representation词向量表示 ...

  9. 词袋模型和词向量模型

    在自然语言处理和文本分析的问题中,词袋(Bag of Words, BOW)和词向量(Word Embedding)是两种最常用的模型.更准确地说,词向量只能表征单个词,如果要表示文本,需要做一些额外 ...

最新文章

  1. 马斯克称特斯拉AutoPilot方案宛如“超人”,首要任务是“不撞车”;网友:???...
  2. python自然语言处理书籍推荐-自然语言处理有哪些好的入门书籍推荐?入门首先应该有哪些实践?...
  3. python资料库-Python对接六大主流数据库,只需三步
  4. 前端学习(2157):webpack-dev-server搭建本地服务
  5. mongodb数据库,批量插入性能测试记录
  6. Linux - 有效群组(effective group)与初始群组(initial group),groups,newgrp
  7. 请推荐好的工作流产品
  8. eclipse让实现类也添加上接口的注释_您的Spring框架注释指南,请注意查收
  9. 苏宁易购上半年营收936.06亿元,零售云加盟店新开1381家
  10. Django:(02)项目配置
  11. hql中 oracle当前时间,hql oracle 比较 日期时间
  12. java 压缩pdf_Java 复制、压缩PDF文档
  13. QQ音乐API爬取全过程
  14. Revit二次开发——导出OBJ格式插件
  15. ppt制作要怎样才会生动形象并深入人心呢
  16. 实验1前篇——BIOS编程空间
  17. html 缩小时字体错位,微信字体设置导致页面错位的解决方法
  18. tcl-debug的下载与安装及NSG2的下载与使用
  19. 【程序员的浪漫】花式表白
  20. 用计算机弹起风了歌词,《起风了买辣椒也用券 抖音热歌起风了》的歌词 LRC完整歌词...

热门文章

  1. CANON佳能I6100故障错误代码和清零方法
  2. 链叨叨直播间丨CryptoMechaKing——末世机甲“元宇宙游戏”来临
  3. 基于云开发的微信小程序实战教程(二)
  4. 一个即将毕业的软件工程硕士研究生的感慨
  5. 乌云平台发布:2014年最新十大安全风险!
  6. MATLAB smooth函数平滑处理
  7. “导师制”新型教学模式的探索
  8. 无需安装Python,就可以在.NET里调用Python库
  9. 【STM32F429的DSP教程】第12章 DSP基础函数-相反数,偏移,移位,减法和比例因子
  10. 太原理工电子信焦工程_太原理工大学电工电子技术剖析.ppt