精华内容
下载资源
问答
  • 为了能在聚类中更 准确地对文本进行相似度计算,本文采用 word2vec 将词语表示成词向量,并提出了一种基 10 于稠密特征的 DC-word2vec 算法,通过引入高频网络词组成的高维词表对特征向量进行扩维 映射,使其变得...
  • 运用Python+Word2vec实现文本相似度 // An highlighted block import pymssql import pandas as pd import jieba #from gensim import corpora, models,similarities #import numpy as np #import nltk from...

    运用Python+Word2vec实现文本相似度


    已爬取的新闻存放在sqlsever
    训练好的model存放在model_out_put_path

    // An highlighted block
    import pymssql
    import pandas as pd
    import jieba
    #from gensim import corpora, models,similarities
    #import numpy as np
    #import nltk
    from gensim.models.word2vec import Word2Vec
    
    ###连接sql sever并读取数据到dataframe
    conn = pymssql.connect
    展开全文
  • Google开源word2vec文本相似度计算工具 谷歌已经使用Deep Learning技术开发了许多新方法来解析语言,目前,谷歌开源了一款基于Deep Learning的学习工具——word2vec,这是首款面向大众的Deep Learning学习工具...

    Google开源word2vec,文本相似度计算工具

    谷歌已经使用Deep Learning技术开发了许多新方法来解析语言,目前,谷歌开源了一款基于Deep Learning的学习工具——word2vec,这是首款面向大众的Deep Learning学习工具。

    word2vec(word to vector)顾名思义,这是一个将单词转换成向量形式的工具。通过转换,可以把对文本内容的处理简化为向量空间中的向量运算,计算出向量空间上的相似度,来表示文本语义上的相似度。

    word2vec为计算向量词提供了一种有效的连续词袋(bag-of-words)和skip-gram架构实现,word2vec遵循Apache License 2.0开源协议。

    如何转换?

    word2vec主要是将文本语料库转换成词向量。它会先从训练文本数据中构建一个词汇,然后获取向量表示词,由此产生的词向量可以作为某项功能用在许多自然语言处理和机器学习应用中。

    在举例子之前,引入余弦距离(Cosine distance)这个概念(摘自维基百科):

    通过测量两个向量内积空间的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。在比较过程中,向量的规模大小不予考虑,仅仅考虑到向量的指向方向。余弦相似度通常用于两个向量的夹角小于90°之内,因此余弦相似度的值为0到1之间。

    然后可以通过distance工具根据转换后的向量计算出余弦距离,来表示向量(词语)的相似度。例如,你输入“france”,distance工具会计算并显示与“france”距离最相近的词,如下:

                  Word             Cosine distance
          -------------------------------------------
                    spain              0.678515
                  belgium              0.665923
              netherlands              0.652428
                    italy              0.633130
              switzerland              0.622323
               luxembourg              0.610033
                 portugal              0.577154
                   russia              0.571507
                  germany              0.563291
                catalonia              0.534176

    在word2vec中主要有两种学习算法:连续词袋和连续skip-gram,switch-cbow允许用户选择学习算法。这两种算法有助于预测其它句子的词汇。

    从词转换到句子或更长的文本

    在一些特定的应用程序中,它还可以用于多个词汇,例如,“san francisco”,这样它就会通过预先处理数据集,让其形成句子,找到与“san francisco”余弦距离最近的内容:

                  Word          Cosine distance
    -------------------------------------------
              los_angeles              0.666175
              golden_gate              0.571522
                  oakland              0.557521
               california              0.554623
                san_diego              0.534939
                 pasadena              0.519115
                  seattle              0.512098
                    taiko              0.507570
                  houston              0.499762
         chicago_illinois              0.491598

    如何衡量词向量质量

    可能影响到词向量质量的几个因素:

    • 训练数据的数量和质量
    • 向量的大小
    • 训练算法

    向量的质量对任何一个应用程序都非常重要,然而,根据复杂的任务来探索不同的超参数设置可能会过于苛刻。因此,我们设计了简单的测试集,来快速评估矢量词的质量。

    词聚类(Word clustering)

    词向量也可以从巨大的数据集中导出词类,通过执行词向量顶部的K-means聚类即可实现,脚本演示地址:./demo-classes.sh,最后输出的是一个词汇表文件和与之对应的类ID标识,例如:

    carnivores 234
    carnivorous 234
    cetaceans 234
    cormorant 234
    coyotes 234
    crocodile 234
    crocodiles 234
    crustaceans 234
    cultivated 234
    danios 234
    .
    .
    .
    acceptance 412
    argue 412
    argues 412
    arguing 412
    argument 412
    arguments 412
    belief 412
    believe 412
    challenge 412
    claim 412

    性能

    在多核CPU上(使用开关‘-threads N’),通过使用并行训练可以显著提高训练速度,超参数选择对性能也至关重要(包括速度和准确率),主要选择有:

    • 架构:skip-gram(慢、对罕见字有利)vs CBOW(快)
    • 训练算法:分层softmax(对罕见字有利)vs 负采样(对常见词和低纬向量有利)
    • 欠采样频繁词:可以提高结果的准确性和速度(适用范围1e-3到1e-5)
    • 维度词向量:通常情况下表现都很好
    • 文本(window)大小:skip-gram通常在10附近,CBOW通常在5附近

    去哪里收集训练数据

    随着训练数据的增加,词向量质量也显著提升,如果以研究为目的的,可以考虑线上数据集:

    快速入门

    1. 代码下载:http://word2vec.googlecode.com/svn/trunk/
    2. 运行“make”编译word2vec工具
    3. 运行demo脚本:./demo-word.sh and ./demo-phrases.sh

    关于word2vec更多介绍,大家可以阅读:https://code.google.com/p/word2vec/


    展开全文
  • 基于doc2vec计算文本相似度

    千次阅读 2020-08-07 19:15:16
    @基于doc2vec计算文本相似度 Doc2vec ​Doc2vec又叫Paragraph Vector是Tomas Mikolov基于word2vec模型提出的,其具有一些优点,比如不用固定句子长度,接受不同长度的句子做训练样本,Doc2vec是一个无监督学习算法,...

    @基于doc2vec计算文本相似度

    Doc2vec

    ​Doc2vec又叫Paragraph Vector是Tomas Mikolov基于word2vec模型提出的,其具有一些优点,比如不用固定句子长度,接受不同长度的句子做训练样本,Doc2vec是一个无监督学习算法,该算法用于预测一个向量来表示不同的文档,该模型的结构潜在的克服了词袋模型的缺点。

    ​Doc2vec模型是受到了word2vec模型的启发,word2vec里预测词向量时,预测出来的词是含有词义的,比如上文提到的词向量’powerful’会相对于’Paris’离’strong’距离更近,在Doc2vec中也构建了相同的结构。所以Doc2vec克服了词袋模型中没有语义的去缺点。假设现在存在训练样本,每个句子是训练样本。和word2vec一样,Doc2vec也有两种训练方式,一种是PV-DM(Distributed Memory Model of paragraphvectors)类似于word2vec中的CBOW模型,另一种是PV-DBOW(Distributed Bag of Words of paragraph vector)类似于word2vec中的skip-gram模型

    最近空闲之余,正好公司也有相应的业务需求,分享一下我最新的作品,一起体会一下nlp世界的魅力,希望各位能喜欢,哈哈哈哈,好了废话不多说,直接上重点!!!

    获取文本句子向量(短文本)

    import pandas as pd
    import jieba.posseg as psg
    import gensim
    from gensim.models.doc2vec import Doc2Vec,TaggedDocument
    import numpy as np
    import os
    import pkuseg
    
    os.environ['CUDA_VISIBLE_DEVICES']='4'
    
    #获取句子向量:
    def get_sentence_vec(excel_path):
        df = pd.read_excel(excel_path, index=False) 
        documents =[]
        #选择需要处理成向量的列并转成列表
        questions = df["questions"].tolist()
        count = 0
        #保留一个原始列
        need_questions = []
        #分词并去除掉停用词
        for question in questions:
                need_questions.append(question)
                documents.append(TaggedDocument(pseg.cut(question), ["word{}".format(count)]))
                count+=1
        #设置相应参数并训练
        model = Doc2Vec(documents, size=100, window=3,min_count=1, workers=4)
        model
        result_vec =[]
        for i in range(count):
            result_vec.append(model["word{}".format(i)])
        return need_questions,np.array(result_vec)
    
    

    Doc2Vec 参量

    文档(列表的iterable TaggedDocument,可选的)–输入语料库可以只是元素列表,但对于较大的语料库,请考虑直接从磁盘/网络流式传输文档的iterable。如果不提供文档(或corpus_file),则模型未初始化-如果计划以其他方式对其进行初始化,请使用该模型。

    corpus_file(str ,可选)– LineSentence格式的语料库文件的路径。您可以使用此参数而不是文档来提高性能。仅需要传递一个文档或 corpus_file参数(或者都不传递它们,在这种情况下,模型将保持未初始化状态)。文档标签是自动分配的,并且等于行号,如中所示 TaggedLineDocument。

    DM({1 ,0} ,任选的) -定义的训练算法。如果dm = 1,则使用“分布式内存”(PV-DM)。否则,将使用分布式单词袋(PV-DBOW)。

    vector_size(int ,optional)–特征向量的维数。

    window(int ,可选)–句子中当前单词和预测单词之间的最大距离。

    alpha(float ,可选)–初始学习率。

    min_alpha(float ,可选)– 随着训练的进行,学习率将线性下降至min_alpha。

    seed(int ,可选)–随机数生成器的种子。每个单词的初始向量都以单词+ str(seed)的连接的哈希值作为种子。请注意,对于完全确定性可重现的运行,还必须将模型限制为单个工作线程(worker = 1),以消除OS线程调度中的排序抖动。在Python 3中,解释程序启动之间的可重复性还需要使用PYTHONHASHSEED 环境变量来控制哈希随机化。

    min_count(int ,optional)–忽略总频率低于此频率的所有单词。

    max_vocab_size(int ,optional)–限制词汇建立期间的RAM;如果有比这更多的独特词,则修剪不常用的词。每1000万个字类型需要大约1GB的RAM。无限设置为无。

    样本(float ,可选)–用于配置对哪些高频词进行随机下采样的阈值,有用范围是(0,1e-5)。

    worker(int ,可选)–使用这些许多worker线程来训练模型(=使用多核计算机进行更快的训练)。

    epochs(int ,optional)–语料库上的迭代次数(epoch)。

    HS({1 ,0} ,任选的) -如果为1,分层SOFTMAX将用于模型训练。如果设置为0,并且负数为非零,则将使用负数采样。

    负数(int ,可选)–如果> 0,将使用负数采样,负数的int指定应绘制多少个“噪声词”(通常在5到20之间)。如果设置为0,则不使用负采样。

    ns_exponent(float ,可选)–用于塑造负采样分布的指数。值1.0与频率成正比地采样,0.0则对所有单词均等地采样,而负值对低频单词的采样比高频单词的采样多。最初的Word2Vec文件选择了流行的默认值0.75。最近,Caselleles-Dupré,Lesaint和Royo-Letelier 在https://arxiv.org/abs/1804.04212中建议,其他值对于推荐应用程序可能会表现更好。

    dm_mean({1 ,0} ,任选的) -如果为0,使用上下文字矢量的总和。如果为1,请使用均值。仅在非连接模式下使用dm时适用。

    dm_concat({1 ,0} ,任选的) -如果为1,上下文矢量而不是总和/平均值的使用级联; 请注意,级联会产生更大的模型,因为输入不再是一个(采样或算术组合)单词向量的大小,而是标签和上下文中所有单词的大小串在一起。

    dm_tag_count(int ,可选)–使用dm_concat模式时,每个文档的预期文档标签数恒定。

    dbow_words({1 ,0} ,任选的) -如果设置为1对列车字向量(在跳过克的方式)同时与DBOW DOC-矢量训练; 如果为0,则仅训练doc矢量(更快)。

    trim_rule(函数,可选)–

    文档对比并计算相似度,匹配最优相似度文本

    #通过空间向量计算句子的分类:
    def calculat_sentence_similarity():
        #导入对照文档
        label_df = pd.read_excel(standard_excel_path,index=False)
        #导入需要对比的文档
        excel_path = r""
        df = pd.read_excel(excel_path, index=False)
        #分词处理
        questions = [que for que in df["questions"].tolist() if len(que)>5 and len(que)<25]
        questions_doc = [TaggedDocument(pseg.cut(que), ["{}".format(index) ])
                     for index,que in enumerate(questions)]
        keys = list(label_df.keys())
        keys.remove("questions")
        label_dic ={}
        doc_tags =[]
        label_documents=[]
        total_labels = []
        for key in keys:
            label = key.split(":")[0]
            total_labels.append(label)
            values = label_df[~label_df[key].isnull()]["questions"].to_list()
            documents =[
                TaggedDocument(pseg.cut(question), ["{}:{}".format(label,index)])
                for index,question in enumerate(values)]
            label_dic[label] = len(documents)
            doc_tags.extend(["{}:{}".format(label,index) for index in range(len(values))])
            label_documents.extend(documents)
        questions_doc.extend(label_documents)
        model = Doc2Vec(questions_doc, size=100, window=3)
        result = []
        #相似度对比并选择最大相似度文本,并给出阈值
        for index,ques in enumerate(questions):
            tag = "{}".format(index)
            most_match = model.docvecs.most_similar_to_given(tag,doc_tags)
            percent = model.docvecs.similarity(tag,most_match)
            result.append({"question":ques,most_match.split(":")[0]:percent})
        #保存并输出结果
        total_labels.append("question")
        re_df = pd.DataFrame(result,columns=total_labels)
        re_df.to_excel()
    
    展开全文
  • Doc2vec计算文本相似度

    千次阅读 2019-10-11 15:48:37
    Doc2Vec模型基于Word2vec模型,并在其基础上增加了一个段落向量。 以Doc2Vec的C-BOW方法为例。算法的主要思想在以下两个方面: 训练过程中新增了paragraph id,即训练语料中每个句子都有一个唯一的id。paragraph id...

    1.Doc2vec模型介绍

    Doc2Vec模型基于Word2vec模型,并在其基础上增加了一个段落向量。 以Doc2Vec的C-BOW方法为例。算法的主要思想在以下两个方面:

    1. 训练过程中新增了paragraph id,即训练语料中每个句子都有一个唯一的id。paragraph id和普通的word一样,也是先映射成一个向量,即paragraph vector。paragraph vector与word vector的维数虽一样,但是来自于两个不同的向量空间。在之后的计算里,paragraph vector和word vector累加或者连接起来,作为输出层softmax的输入。在一个句子或者文档的训练过程中,paragraph id保持不变,共享着同一个paragraph vector,相当于每次在预测单词的概率时,都利用了整个句子的语义。
    2. 在预测阶段,给待预测的句子新分配一个paragraph id,词向量和输出层softmax的参数保持训练阶段得到的参数不变,重新利用梯度下降训练待预测的句子。待收敛后,即得到待预测句子的paragraph vector。

    通过对模型结构图来区别Doc2vec与Word2vec。

    图1. Word2vec模型结构图

    图2. Doc2vec模型结构图


    Doc2vec模型通过增加paragraph vector,相当于在进行训练的时候,为每一个word的预测同时考虑到了文章的整体信息,可以理解为主题,也即是给每一个单词都赋予了文章主旨,这样一来,在进行文本相似度计算的时候,也就更多的考虑到了文章整体表达的中心意思。 

    2.模型训练

    对于模型的训练,实现也非常方便,利用Python的gensim.Dco2vec接口即可以进行训练,主要步骤如下:

        1. 将原始文本语料进行分词,去停用词处理,最后保存为文本文件。
        示例:
        1000 北京 欢迎 各国 朋友
        1001 中华 民族 团结友爱
        前面的‘1000’、‘1001’是文档编号,你也可以按自己的方式进行生成。后面训练的时候会用到。
        
        2. 将处理后的文档进行paragraph打标处理:
        
        gensim.models.doc2vec.TaggedDocument(words=doc.split(), tags=doc_id)
        其中doc为分词处理后的每篇文档,以空格作为分隔符分隔,doc_id也即为文档编号,是唯一值。
        
        3. 定义模型结构及参数
        model = gensim.models.Doc2Vec(vector_size=256, window=10, min_count=5,
                                      workers=4, alpha=0.025, min_alpha=0.025, epochs=12)
        关于各参数的解释如下,
        · vector_size:是指特征向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好.
        · window:表示当前词与预测词在一个句子中的最大距离是多少
        · alpha: 是学习速率
        · min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5
        · workers参数控制训练的并行数。
        · epochs: 迭代次数,默认为5
        
        4. 将处理后的数据带入模型进行训练
        
        model.build_vocab(train_data)
        train_data是第二步将所有文档处理后的数据,也即为模型训练所用的数据。
    
        model.train(train_data, total_examples=model.corpus_count, epochs=12)
    
        5. 模型的保存
        model.save("./models/doc2vec.model")


    3.文本相似度计算

    文本相似度的计算方式有很多,比较常用的也就是余弦相似度。
    余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间。
    余弦值的范围在[-1,1]之间,值越趋近于1,代表两个向量的方向越接近;越趋近于-1,他们的方向越相反;接近于0,表示两个向量近乎于正交。
    最常见的应用就是计算文本相似度。将两个文本根据他们词,建立两个向量,计算这两个向量的余弦值,就可以知道两个文本在统计学方法中他们的相似度情况。实践证明,这是一个非常有效的方法。

    公式:def similarity(a_vect, b_vect)
    a_vect, b_vect是文本处理后得到的向量。
    通过model.wv[w]得到单个词语的向量。

    最后给出该项目的地址:https://github.com/KAIKAIZHANG/text_similarity.git
    欢迎阅读,如有不当之处,欢迎交流。参考了以下两篇文章:

    https://blog.csdn.net/juanjuan1314/article/details/75461180

    https://www.cnblogs.com/softmax/p/9042397.html

    展开全文
  • word2vec_文本相似度

    2018-11-19 10:32:00
    #提取关键词#关键词向量化#相似度计算from jieba import analyseimport numpyimport gensim# 实现给出任意字符串,获取字符串中某字符的位置以及出现的总次数def get_char_pos(string,char): chPos=[] try: chPos=...
  • gensim中doc2vec计算文本相似度

    万次阅读 2018-09-06 17:14:20
    最近在做判断两个文本是否是描述的同一件事情,之前是采用gensim中的TF-IDF进行计算的...我们都知道word2vec是可以分析语义的,那么doc2vec是不是也可以分析出语义呢?于是试了一下gensim中的doc2vec。 Doc2Vec 也...
  • 用gensim doc2vec计算文本相似度

    万次阅读 热门讨论 2017-07-14 16:48:14
    最近开始接触gensim库,之前训练word2vec用Mikolov的c版本程序,看了很久才把程序看明白,在gensim库中,word2vec和doc2vec只需要几个接口就可以实现,实在是方便。python,我越来越爱你了。 这个程序很简单,直接...
  • 从而不能from gensim.models import Word2Vec。 不能load_model.word2vec_model.wmdistance(sentence1,sentence2)。 因此根据原码更改了引入gensim包的部分内容。2.改写后的代码import pyemd from gensim
  • NLP:用word2vec分析文本相似度

    千次阅读 2019-12-18 15:25:03
    一.中文语料库 中文语料库主要有以下几种: 1. 腾讯AI Lab2018年分享的开源800万中文词的NLP数据集文章...mid=2247506252&idx=4&sn=1f883532975737c9df02212fc2ae1ca5&chksm=e8d06e3edf...
  • 对于使用提取特征来完成的任务,比如文本相似度比较或者生成机器学习模型,只出现一次的单词是没有价值的,因为这些单词我们没有足够的训练数据。 // filter out rare tokens with total occurence < 2 val ...
  • 计算文本相似度Word2Vec计算

    千次阅读 热门讨论 2018-10-18 19:14:47
    Word2Vec,顾名思义,其实就是将每一个词转换为向量的过程。 如果不了解的话可以参考:https://blog.csdn.net/itplus/article/details/37969519 这里我们可以直接下载训练好的 Word2Vec 模型, 模型的链接地址为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,292
精华内容 2,516
关键字:

word2vec计算文本相似度