NLP学习(九)文本向量化doc2vec及案例实现-Python3实现

2023-11-10

doc2vec基本原理

  1. A distributed memory model

训练句向量的方法和词向量的方法非常类似。训练词向量的核心思想就是说可以根据每个单词的上下文预测,也就是说上下文的单词对是有影响的。那么同理,可以用同样的方法训练doc2vec。例如对于一个句子i want to drink water,如果要去预测句子中的单词want,那么不仅可以根据其他单词生成feature, 也可以根据其他单词和句子来生成feature进行预测。因此doc2vec的框架如下所示:
在这里插入图片描述
每个段落/句子都被映射到向量空间中,可以用矩阵的一列来表示。每个单词同样被映射到向量空间,可以用矩阵的一列来表示。然后将段落向量和词向量级联或者求平均得到特征,预测句子中的下一个单词。

这个段落向量/句向量也可以认为是一个单词,它的作用相当于是上下文的记忆单元或者是这个段落的主题,所以我们一般叫这种训练方法为Distributed Memory Model of Paragraph Vectors(PV-DM)

在训练的时候我们固定上下文的长度,用滑动窗口的方法产生训练集。段落向量/句向量 在该上下文中共享。

总结doc2vec的过程, 主要有两步:

A. 训练模型,在已知的训练数据中得到词向量, softmax的参数和,以及段落向量/句向量
B. 推断过程(inference stage),对于新的段落,得到其向量表达。具体地,在矩阵中添加更多的列,在固定,的情况下,利用上述方法进行训练,使用梯度下降的方法得到新的D,从而得到新段落的向量表达

  1. Paragraph Vector without word ordering: Distributed bag of words

还有一种训练方法是忽略输入的上下文,让模型去预测段落中的随机一个单词。就是在每次迭代的时候,从文本中采样得到一个窗口,再从这个窗口中随机采样一个单词作为预测任务,让模型去预测,输入就是段落向量。如下所示:
在这里插入图片描述
我们称这种模型为 Distributed Bag of Words version of Paragraph Vector(PV-DBOW)

在上述两种方法中,我们可以使用PV-DM或者PV-DBOW得到段落向量/句向量。对于大多数任务,PV-DM的方法表现很好,但我们也强烈推荐两种方法相结合。

  1. 基于gensim的doc2vec实践

我们使用第三方库gensim进行doc2vec模型的训练

# -*- coding: utf-8 -*-
import sys
import logging
import os
import gensim
# 引入doc2vec
from gensim.models import Doc2Vec
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)
from utilties import ko_title2words
 
# 引入日志配置
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
 
# 加载数据
documents = []
# 使用count当做每个句子的“标签”,标签和每个句子是一一对应的
count = 0
with open('../data/titles/ko.video.corpus','r') as f:
    for line in f:
        title = unicode(line, 'utf-8')
        # 切词,返回的结果是列表类型
        words = ko_title2words(title)
        # 这里documents里的每个元素是二元组,具体可以查看函数文档
        documents.append(gensim.models.doc2vec.TaggedDocument(words, [str(count)]))
        count += 1
        if count % 10000 == 0:
            logging.info('{} has loaded...'.format(count))
 
# 模型训练
model = Doc2Vec(documents, dm=1, size=100, window=8, min_count=5, workers=4)
# 保存模型
model.save('models/ko_d2v.model')

接下来看看训练好的模型可以做什么

def test_doc2vec():
    # 加载模型
    model = doc2vec.Doc2Vec.load('models/ko_d2v.model')
    # 与标签‘0’最相似的
    print(model.docvecs.most_similar('0'))
    # 进行相关性比较
    print(model.docvecs.similarity('0','1'))
    # 输出标签为‘10’句子的向量
    print(model.docvecs['10'])
    # 也可以推断一个句向量(未出现在语料中)
    words = u"여기 나오는 팀 다 가슴"
    print(model.infer_vector(words.split()))
    # 也可以输出词向量
    print(model[u'가슴'])

实战:网页文本向量化

语料:下载地址是https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2,或者在这里找https://dumps.wikimedia.org/zhwiki/。这个文件只包含了标题和正文,不包含词条之间的链接信息,大小约为1.3G

1、段落向量的训练
与训练词向量不同的是无需再对文档进行分词,直接将简体文本保留。doc2vec在训练时能够采用Tag信息更好地辅助训练(表明是同一类doc)输入文档多了一个tag属性。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import gensim.models as g
from gensim.corpora import WikiCorpus
import logging
from langconv import *
 
#enable logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
 
docvec_size=192
class TaggedWikiDocument(object):
    def __init__(self, wiki):
        self.wiki = wiki
        self.wiki.metadata = True
    def __iter__(self):
        import jieba
        for content, (page_id, title) in self.wiki.get_texts():
            yield g.doc2vec.LabeledSentence(words=[w for c in content for w in jieba.cut(Converter('zh-hans').convert(c))], tags=[title])
 
def my_function():
    zhwiki_name = './data/zhwiki-latest-pages-articles.xml.bz2'
    wiki = WikiCorpus(zhwiki_name, lemmatize=False, dictionary={})
    documents = TaggedWikiDocument(wiki)
 
    model = g.Doc2Vec(documents, dm=0, dbow_words=1, size=docvec_size, window=8, min_count=19, iter=5, workers=8)
    model.save('data/zhiwiki_news.doc2vec')
 
if __name__ == '__main__':
    my_function()

2、 doc2vec计算网页相似度
三步走:预处理->文档向量化->.计算文本相似

import gensim.models as g
import codecs
import numpy
import numpy as np
 
model_path = './data/zhiwiki_news.doc2vec'
start_alpha = 0.01
infer_epoch = 1000
docvec_size = 192
 
 
def simlarityCalu(vector1, vector2):
    vector1Mod = np.sqrt(vector1.dot(vector1))
    vector2Mod = np.sqrt(vector2.dot(vector2))
    if vector2Mod != 0 and vector1Mod != 0:
        simlarity = (vector1.dot(vector2)) / (vector1Mod * vector2Mod)
    else:
        simlarity = 0
    return simlarity
 
 
def doc2vec(file_name, model):
    import jieba
    doc = [w for x in codecs.open(file_name, 'r', 'utf-8').readlines() for w in jieba.cut(x.strip())]
    doc_vec_all = model.infer_vector(doc, alpha=start_alpha, steps=infer_epoch)
    return doc_vec_all
 
 
if __name__ == '__main__':
    model = g.Doc2Vec.load(model_path)
    p1 = './data/P1.txt'
    p2 = './data/P2.txt'
    P1_doc2vec = doc2vec(p1, model)
    P2_doc2vec = doc2vec(p2, model)
    print(simlarityCalu(P1_doc2vec, P2_doc2vec))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NLP学习(九)文本向量化doc2vec及案例实现-Python3实现 的相关文章

  • 从动词列表中检索动词

    我有一个全是动词的字符串列表 我需要获取每个动词的词频 但我想将 想要 想要 想要 和 想要 等动词计为一个动词 形式上 动词 被定义为 4 个单词的集合 其形式为 X Xs Xed Xing 或形式为 X Xes Xed Xing 其中
  • word2vec gensim 多种语言

    这个问题完全超出了我的想象 我正在使用 gensim 训练 Word2Vec 模型 我提供了多种语言的数据 即英语和印地语 当我试图找到最接近 人 的词时 我得到的是 model wv most similar positive man O
  • 如何将地名词典或词典表示为 crf++ 中的特征?

    如何使用地名词典或词典作为功能CRF https taku910 github io crfpp 详细说明 假设我想对人名进行 NER 并且我有一个包含常见人名的地名词典 或字典 我想使用这个地名词典作为 crf 的输入 我该怎么做 我正在
  • 下载变压器模型以供离线使用

    我有一个训练有素的 Transformer NER 模型 我想在未连接到互联网的机器上使用它 加载此类模型时 当前会将缓存文件下载到 cache 文件夹 要离线加载并运行模型 需要将 cache 文件夹中的文件复制到离线机器上 然而 这些文
  • 比较文本文档含义的最佳方法?

    我正在尝试找到使用人工智能和机器学习方法来比较两个文本文档的最佳方法 我使用了 TF IDF Cosine 相似度和其他相似度度量 但这会在单词 或 n gram 级别上比较文档 我正在寻找一种方法来比较meaning的文件 最好的方法是什
  • 使用我自己的训练示例训练 spaCy 现有的 POS 标记器

    我正在尝试在我自己的词典上训练现有的词性标注器 而不是从头开始 我不想创建一个 空模型 在spaCy的文档中 它说 加载您想要统计的模型 下一步是 使用add label方法将标签映射添加到标记器 但是 当我尝试加载英文小模型并添加标签图时
  • target_vocab_size 在方法 tfds.features.text.SubwordTextEncoder.build_from_corpus 中到底意味着什么?

    根据这个链接 https www tensorflow org datasets api docs python tfds features text SubwordTextEncoder build from corpus target
  • 从文本文件中提取与输入单词最相似的前 N ​​个单词

    我有一个文本文件 其中包含我使用 BeautifulSoup 提取的网页内容 我需要根据给定的单词从文本文件中找到 N 个相似的单词 流程如下 从中提取文本的网站 https en wikipedia org wiki Football h
  • NLTK 中的无监督 HMM 训练

    我只是想进行非常简单的无监督 HMM 训练nltk http www nltk org 考虑 import nltk trainer nltk tag hmm HiddenMarkovModelTrainer from nltk corpu
  • python中的语音识别持续时间设置问题

    我有一个 Wav 格式的音频文件 我想转录 我的代码是 import speech recognition as sr harvard sr AudioFile speech file wav with harvard as source
  • SpaCy 模型“en_core_web_sm”的词汇量大小

    我尝试在 SpaCy 小模型中查看词汇量 model name en core web sm nlpp spacy load model name len list nlpp vocab strings 只给了我 1185 个单词 我也在同
  • ANEW 字典可以用于 Quanteda 中的情感分析吗?

    我正在尝试找到一种方法来实施英语单词情感规范 荷兰语 以便使用 Quanteda 进行纵向情感分析 我最终想要的是每年的 平均情绪 以显示任何纵向趋势 在数据集中 所有单词均由 64 名编码员按照 7 分李克特量表在四个类别上进行评分 这提
  • 快速NLTK解析成语法树

    我正在尝试将数百个句子解析为语法树 我需要快速完成 问题是如果我使用 NLTK 那么我需要定义一个语法 而我不知道我只知道它会是英语 我尝试使用this https github com emilmont pyStatParser统计解析器
  • 使用 NLP 进行地址分割

    我目前正在开发一个项目 该项目应识别地址的每个部分 例如来自 str Jack London 121 Corvallis ARAD ap 1603 973130 输出应如下所示 street name Jack London no 121
  • 使用 SciKit-learn 和大型数据集进行文本分类

    首先 我昨天开始学习Python 我正在尝试使用 SciKit 和大型数据集 250 000 条推文 进行文本分类 对于该算法 每条推文都将表示为 4000 x 1 向量 因此这意味着输入为 250 000 行和 4000 列 当我尝试在
  • Lucene 标准分析器与 Snowball

    刚刚开始使用 Lucene Net 我使用标准分析器索引了 100 000 行 运行了一些测试查询 并注意到如果原始术语是单数 则复数查询不会返回结果 我知道雪球分析器增加了词干支持 这听起来不错 不过 我想知道 超过标准的雪球锣是否有任何
  • 获取 NLTK 索引的所有结果

    我正在使用 NLTK 来查找单词的一致性 但我不知道如何获取所有结果并将它们放入list or set 例如 text concordance word 仅打印前 25 个结果 TL DR text concordance lines 10
  • 如何使用FeatureUnion转换PipeLine中的多个特征?

    我有一个 pandas 数据框 其中包含有关用户发送的消息的信息 对于我的模型 我感兴趣的是预测消息的缺失收件人 即给定消息的收件人 A B C 我想预测还有谁应该成为收件人的一部分 我正在使用 OneVsRestClassifier 和
  • 使用 OpenNLP 获取句子的解析树。陷入困境。

    OpenNLP 是一个关于自然语言处理的 Apache 项目 NLP 程序的目标之一是解析一个句子 并给出其语法结构的树 例如 天空是蓝色的 这句话 可能会被解析为 S NP VP The sky is blue where S是句子 NP
  • nltk 标记化和缩写

    我用 nltk 对文本进行标记 只是将句子输入到 wordpunct tokenizer 中 这会拆分缩写 例如 don t 到 don t 但我想将它们保留为一个单词 我正在改进我的方法 以实现更精确的文本标记化 因此我需要更深入地研究

随机推荐

  • MySQL巧妙利用help_topic表把以逗号分隔的字符串转换成行

    MySQL巧妙利用help topic表把以逗号分隔的字符串转换成行 脚本 select substring index substring index 82 83 84 85 86 help topic id 1 1 as Id from
  • linux编译运行c++多线程程序

    引言 Linux下编译运行普通的C 程序此前已有文章介绍不再累述 下文主要介绍Linux下如何编译多线程的c 程序 正文 首先尝试编译 cpp文件 例中文件名test2 cpp 执行 g test2 cpp 后可看到编译不通过 报了许多错
  • 解决Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问。(win10下升级pip)

    一 问题描述 在dos下升级pip时 报错如下 Could not install packages due to an EnvironmentError WinError 5 拒绝访问 c program files python37 l
  • 081基于深度学习的农业病虫害检测小程序版本

    卷积网路CNN分类的模型一般使用包括alexnet DenseNet DLA GoogleNet Mobilenet ResNet ResNeXt ShuffleNet VGG EfficientNet和Swin transformer等1
  • 欧姆龙温控器参数笔记(五)(高级功能设定菜单)

    要进入这个菜单是需要输入密码的 密密麻麻的 但是大多是重复的 比如关于报警 关于输出分配 项目显示 重点 比如这里选择o 温控器就控制ssr来进行加热 比如这里可以sub1设为run sub2设为ha 这个时候 温控器工作的时候 输出sub
  • opencv--图像金字塔--高斯金字塔

    什么是图像金字塔 我们需要了解一个概念 尺度 尺度 顾名思义就是说图像的尺寸和分辨率 在我们进行图像处理的时候 会经常对源图像的尺寸进行放大或者缩小的变换 进而转换为我们指定尺寸的目标图像 在对图像进行放大和缩小的变换的这个过程 我们称为尺
  • QT多线程(QThread)小结

    QThread只有run函数是在新线程里的 其他所有函数都在QThread生成的线程里 如果QThread是在ui所在的线程里生成 那么QThread的其他非run函数都是和ui线程一样的 所以 QThread的继承类的其他函数尽量别要有太
  • 如何使用 Xshell 连接 Linux 服务器

    目录 搭建 Linux 环境 Linux 环境的搭建方式 购买云服务器 使用Xshell远程登陆到Linux服务器 下载安装Xshell 查看Linux主机ip 使用Xshell登录主机 方法1 方法2 额外补充 总结 搭建 Linux 环
  • GBase 8s V8.8 SQL 指南:教程-1.4

    1 4 示例代码约定 SQL 代码的示例在整个出版物中出现 除非另有说明 代码不特定于任何单个的 GBase 8s 应用程序开发工具 如果示例中仅列出 SQL 语句 那么它们将不用分号定界 例如 您可能看到以下示例中 的代码 要将此 SQL
  • 【100%通过率】【华为OD机试c++/java/python】通信误码【 2023 Q1考试题 A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 信号传播过程中会出现一些误码 不同的数字表示不同的误码ID 取值范围为1 65535 用一个数组记录误码出现的情况 每个误码出现的次数代表误码频
  • 04目标检测-Two-stage的目标检测算法

    目录 一 深度学习目标检测算法介绍 二 基于Two stage的目标检测算法 三 Two stage基本流程 四 Two stage常见算法 五 Two stage核心组件 1 Two stage的两个核心组件 2 主干CNN网络设计原则
  • 大一软件工程学生想买电脑,应该如何选择呢?

    全文1万多字 计算机专业怎么选购笔记本电脑 哪些电脑性价比高 轻薄本 全能本 游戏本有什么推荐 看这篇就够了 每天都有邀请我回答关于计算机专业电脑选择的问题 看来如何选购电脑确实是大学生的痛点 不过丑话先说在前面 本人是CS科班毕业 但由于
  • git更新pull不下来代码_git pull更新错误解决办法

    Your local changes to the following files would be overwritten by merge error Your local changes to the following files
  • conda的一些简单操作 for Mac

    在终端输入 conda h 就会列出conda的介绍 和一些命令 如 clean config create help info install list package remove uninstall search update upg
  • 程序员入门教程【非常详细】从零基础入门到精通,看完这一篇就够了 !

    零基础编程入门先学什么 编程语言有几百种 我们应该怎么选择 想学习编程 加入互联网行业 哪一个更有前途 在小白学习编程会有各种各样的问题 今天小编我就来为你解答 一 怎么选择编程语言 编程语言有很多种 但方向不同 每个人都需要根据工作方向
  • BUUCTF闯关日记--[CISCN2019 华北赛区 Day2 Web1]Hack World

    可恶 明明当初想着是写给自己看的 文章越写越多 越来越在意别人会不会看我的文章了 还是太功名利禄了 我得清高点 这是写给自己看 这是写给自己看 这是写给自己看 进入页面 可以看到只有一个白框 多半是SQL注入 直接开始做题 输入 1 回显
  • win10任务管理器快捷键是什么

    win10任务管理器快捷键是什么 Ctrl Shift ESC
  • Zabbix整合钉钉实战

    1 基本告警思路 钉钉类似于微信 但是偏向于办公方向 可以通过钉钉的群机器人功能 实现将告警信息通过机器人发送到钉钉群 群机器人是钉钉群的高级扩展功能 群机器人可以将第三方服务的信息聚合到群聊中 实现自动化的信息同步 2 添加钉钉机器人 首
  • YOLOV5学习笔记(一)——原理概述

    目录 一 目标检测概述 1 1 数据集介绍 1 2 性能指标 1 2 1 混淆矩阵 1 2 2 IOU 边界框回归 1 2 3 AP mAP 1 2 4 检测速度 1 3 YOLO发展史 1 3 1 算法思想 1 3 2 YOLOv5网络架
  • NLP学习(九)文本向量化doc2vec及案例实现-Python3实现

    doc2vec基本原理 A distributed memory model 训练句向量的方法和词向量的方法非常类似 训练词向量的核心思想就是说可以根据每个单词的上下文预测 也就是说上下文的单词对是有影响的 那么同理 可以用同样的方法训练d