精华内容
下载资源
问答
  • 词袋模型

    2019-05-31 00:11:32
    # 操作词袋模型: # CountVectorizer:对语料库中出现的词汇进行词频统计,相当于词袋模型。 # 操作方式:将语料库当中出现的词汇作为特征,将词汇在当前文档中出现的频率(次数)作为特征值。 import numpy as np ...
    #  操作词袋模型:
    # CountVectorizer:对语料库中出现的词汇进行词频统计,相当于词袋模型。
    # 操作方式:将语料库当中出现的词汇作为特征,将词汇在当前文档中出现的频率(次数)作为特征值。
    import numpy as np
    from sklearn.feature_extraction.text import CountVectorizer
    count = CountVectorizer()
    
    # 语料库
    docs = np.array([
        "Where there is a will, there is a way.",
        "There is no royal road to learning.",
    ])
    # bag是一个稀疏的矩阵。因为词袋模型就是一种稀疏的表示。
    bag = count.fit_transform(docs)
    # 输出单词与编号的映射关系。
    print(count.vocabulary_)
    # 调用稀疏矩阵的toarray方法,将稀疏矩阵转换为ndarray对象。
    print(bag)
    print(bag.toarray())
    
    # where映射为编号8  there映射为编号5······
    # 编号也是bag.toarray转换来的ndarray数组的索引
    

    在这里插入图片描述

    展开全文
  • 词袋模型和词向量模型

    万次阅读 多人点赞 2016-06-05 19:47:44
    本文简要介绍了词袋模型、词向量模型的原理和应用。

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

    所谓BOW,就是将文本/Query看作是一系列词的集合。由于词很多,所以咱们就用袋子把它们装起来,简称词袋。至于为什么用袋子而不用筐(basket)或者桶(bucket),这咱就不知道了。举个例子:

                       文本1:苏宁易购/是/国内/著名/的/B2C/电商/之一

    这是一个短文本。“/”作为词与词之间的分割。从中我们可以看到这个文本包含“苏宁易购”,“B2C”,“电商”等词。换句话说,该文本的的词袋由“苏宁易购”,“电商”等词构成。就像这样:

    但计算机不认识字,只认识数字,那在计算机中怎么表示词袋模型呢?其实很简单,给每个词一个位置/索引就可以了。例如,我们令“苏宁易购”的索引为0,“电商”的索引为1,其他以此类推。则该文本的词袋就变成了:

    是的,词袋变成了一串数字的(索引)的集合。这样计算机就能读懂了。如果用程序来描述的话,就会像:Set<int>(0,1,2…)。当然,刚才的例子中像“苏宁易购”等词只出现了一次,如果出现多次,可能就需要支持重复元素的容器了,如Java/C++中的MultiSet。

    可是,在实际的应用中(如:文本的相似度计算),用刚才说的容器是非常不方便的(如果要用,需要额外用Map容器来存储一本字典来表征词和索引的映射关系)。因此我们考虑用更简单的数据结构来组织词袋模型。既然刚才说词是用数字(索引)来表示的,那自然我们会想到数组。例如:

             Intwords[10000] = {1,20,500,0,……}

                                         索引:{0,1,2,3,……}

                                         词:   {苏宁易购,是,国内,B2C,……}

    数组的下标表示不同的词,数组中的元素表示词的权重(如:TF,TF-IDF)。更为一般的,词的索引可以用词的HashCode来计算,即:Index(苏宁易购) = HashCode(苏宁易购)。将词散列到数组的某个位置,并且是固定的(理论上会有冲突,需要考虑冲突的问题)。因此,HashCode这个函数起到了字典的作用。转化成了数组,接下来计算余弦相似度啥的就好办多了。这就是词袋模型。

    下面讲讲词向量模型。实际上,单个词的词向量不足以表示整个文本,能表示的仅仅是这个词本身。往往,这个词向量是个高维的向量(几万甚至几十万)。先不说它是如何得到的,单说它的应用应该是很广泛的。再举文本相似度的例子,既然词可以用一串数字表示,那么自然可以用余弦相似度或欧式距离计算与之相近的词。这样,词的聚类什么的都可以做了。那长文本怎么办呢?一个简单的办法是把这个文本中包含的词的词向量相加。这样长文本也就表示成了一串数字。可是这种处理方法总让我们觉得怪怪的。看到过有同学做的测试,当文本只有十几个字的时候,这种处理方法还算凑合,字多了,结果就很难看了。至于词向量是怎么获得,咱下回再说。目前word2vec有多种版本可供大家使用。至于像doc2vec,sentence2vec的效果还有待评估。

    展开全文
  • 利用词袋模型,实现对Merchdata数据库内图像的标注功能。使用了bagoffeatures库函数。
  • 词袋模型描述图像

    2014-04-04 12:24:06
    学习词袋模型的简单明了的ppt,清晰介绍了词袋模型的来源、建立过程以及优点、不足。
  • 详解词袋模型

    千次阅读 2020-03-20 22:33:01
    ... 本文是<...的学习笔记,今天学习到词袋模型,可以用来计算图像间的相似度。 基本概念 词袋(Bag-of-Words,BoW),是用“图像上有哪几种特征”来描述一个图像的方法。图像的词袋模型可以度量两个...

     个人博客:http://www.chenjianqu.com/

    原文链接:http://www.chenjianqu.com/show-101.html

    本文是<视觉SLAM14讲>的学习笔记,今天学习到词袋模型,可以用来计算图像间的相似度。

    基本概念

        词袋(Bag-of-Words,BoW),是用“图像上有哪几种特征”来描述一个图像的方法。图像的词袋模型可以度量两个图像的相似性:首先需要确定BoW中的“单词”,许多单词放在一起,组成“字典”。然后确定一张图像中出现了哪些单词(这里的单词对应的是特征),把图像转换成了一个向量。最后根据向量,设计一定的计算方式,就能确定图像间的相似性了。

        通过字典和单词,只需一个向量就可以描述整张图像了。该向量描述的是“图像是否含有某类特征”的信息,比单纯的灰度值更加稳定。因为描述向量说的是“是否出现”,而不管它们“在哪儿出现”,所以与物体的空间位置和排列顺序无关,因此称它为Bag-of-Words。在相机发生少量运动时,只要物体仍在视野中出现,就仍然保证描述向量不发生变化。

     

    单词的权重

        一张图像可以提取出N个特征,这N个特征可以对应到字典中的N各单词,即得到了该图像的单词序列。考虑到不同的单词(特征)在区分性上的重要性并不相同,我们希望对单词的区分性或重要性加以评估,给它们不同的权值以起到更好的效果,常用的一种做法称为 TF-IDF(Term Frequency–Inverse Document Frequency,频率-逆文档频率)。TF 部分的思想是,某单词在一个图像中经常出现,它的区分度就高。IDF 的思想是,某单词在字典中出现的频率越低,则分类图像时区分度越高。

        在词袋模型中,在建立字典时计算 IDF 部分。统计某个单词 wi 中的特征数量相对于所有特征数量的比例,作为 IDF 部分。假设所有特征数量为 n,wi 数量为 ni,那么:IDFi=log(n/ni) 

        TF 部分则是指某个特征在单个图像中出现的频率。假设图像 A 中,单词wi 出现了 ni 次,而一共出现的单词次数为 n,那么:TFi = ni/n

        单词 wi 的TF-IDF权重:ni TFi * IDFi

        对于某个图像 A,它的特征点可对应到许多个单词,组成它的 Bag-of Words:A = {(w1,η1),(w2,η2), . . . ,(wn,ηn)} = vA 。通过词袋,我们用单个向量 vA 描述了图像 A。向量 vA 是一个稀疏的向量,它的非零部分指示出图像 A 中含有哪些单词,而这些部分的值为 TF-IDF 的值。

     

    字典的构建

        字典由很多单词组成,而每一个单词代表了一类特征。一个单词与一个单独的特征点不同,它不是从单个图像上提取出来的,而是某一类特征的组合。所以,字典生成问题类似于一个聚类(Clustering)问题。假设对大量的图像提取了N 个特征点,我们想找一个有 k 个单词的字典,每个单词可以看作局部相邻特征点的集合,这可以用经典的 K-means(K 均值)算法解决。K-means算法流程:

    1. 随机选取 k 个中心点:c1, . . . , ck;

    2. 对每一个样本,计算与每个中心点之间的距离,取最小的作为它的归类;

    3. 重新计算每个类的中心点。

    4. 如果每个中心点都变化很小,则算法收敛,退出;否则返回 1。

        考虑到字典的通用性,通常会使用一个较大规模的字典,以保证当前使用环境中的图像特征都曾在字典里出现过。为了加快字典的查找效率,常用K叉树表达字典。假定有 N 个特征点,希望构建一个深度为 d,每次分叉为 k 的树,那么做法如下:

    1. 在根节点,用 k-means 把所有样本聚成 k 类(实际中为保证聚类均匀性会使用k-means++)。这样得到了第一层。

    2. 对第一层的每个节点,把属于该节点的样本再聚成 k 类,得到下一层。

    3. 依此类推,最后得到叶子层。叶子层即为所谓的 Words。

    如下图:

    A.jpg

        最终在叶子层构建了单词,树结构中的中间节点仅供快速查找时使用。这样一个 k 分支,深度为 d 的树,可以容纳 kd 个单词。在查找某个给定特征对应的单词时,只需将它与每个中间结点的聚类中心比较(一共 d 次),即可找到最后的单词,保证了对数级别的查找效率。

     

    相似度计算

        给定两张图像的单词向量vA ,vB,可以通过多种方式计算它们的差异。比如这里使用L1范数形式:

    B.jpg

    代码实现

        这里使用ORB特征的描述子作为BoW的特征,使用DBoW3库实现词袋模型。字典往往是从更大的数据集中生成的,而且最好是来自目标应该环境类似的地方。我们通常使用较大规模的字典——越大代表字典单词量越丰富,容易找到与当前图像对应的单词。下面是代码实现:

    CMakeLists.txt

    cmake_minimum_required(VERSION 2.6)
    project(dbow3_test)
    set( CMAKE_CXX_FLAGS "-std=c++11" )
    find_package( OpenCV 3 REQUIRED )
    include_directories( ${OpenCV_INCLUDE_DIRS} )
    set( DBoW3_INCLUDE_DIRS "/usr/local/include" )
    set( DBoW3_LIBS "/usr/local/lib/libDBoW3.a" )
    add_executable(dbow3_test main.cpp)
    target_link_libraries(dbow3_test ${OpenCV_LIBS} ${DBoW3_LIBS})
    install(TARGETS dbow3_test RUNTIME DESTINATION bin)

    main.cpp

    #include <iostream>
    #include <string>
    #include <vector>
    #include <string.h>
    #include <dirent.h>
    #include <DBoW3/DBoW3.h>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/features2d/features2d.hpp>
    
    using namespace std;
    using namespace cv;
    
    //读取某路径下的所有文件名
    int getFiles(const string path, vector<string>& files)
    {
        int iFileCnt = 0;
        DIR *dirptr = NULL;
        struct dirent *dirp;
        if((dirptr = opendir(path.c_str())) == NULL)//打开一个目录
            return 0;
        while ((dirp = readdir(dirptr)) != NULL){
            if ((dirp->d_type == DT_REG) && 0 ==(strcmp(strchr(dirp->d_name, '.'), ".png")))//判断是否为文件以及文件后缀名
            files.push_back(dirp->d_name);
            iFileCnt++;
        }
        closedir(dirptr);
        return iFileCnt;
    }
    
    //构建字典
    void generateDict()
    {
        string dataPath = "/media/chen/chen/SLAM/projects_test/DBow3_test/data";
        vector<string> files;
        getFiles(dataPath,files);//获取图片名
        //读取图片并提取ORB描述子
        vector<Mat> descriptors;
        Ptr< Feature2D > detector = ORB::create();
        for(const auto &x: files)
        {
            string picName=dataPath+"/"+x;
            cout << picName << endl;
            vector<KeyPoint> keypoints; 
            Mat descriptor;
            detector->detectAndCompute( imread(picName), Mat(), keypoints, descriptor );
            descriptors.push_back( descriptor );
        }
        DBoW3::Vocabulary vocab;
        vocab.create( descriptors );
        cout<<"vocabulary info: "<<vocab<<endl;
        vocab.save( "../vocabulary.yml.gz" );
        cout<<"done"<<endl;  
    }
    
    int main(int argc, char** argv)
    {
      //生成字典
      //generateDict();
      
        //用字典判断图像相似度
        //DBoW3::Vocabulary vocab("../vocab_larger.yml.gz");//10张图像得到的字典
        DBoW3::Vocabulary vocab("../vocab_larger.yml.gz");//2900张图像得到的字典
        
        //提取ORB的描述子
        Mat despA,despB,despC;
        Ptr< Feature2D > detector = ORB::create();
        vector<KeyPoint> keypoints; 
        detector->detectAndCompute( imread("../test/A.png"), Mat(), keypoints, despA );
        detector->detectAndCompute( imread("../test/B.png"), Mat(), keypoints, despB );
        detector->detectAndCompute( imread("../test/C.png"), Mat(), keypoints, despC );
        
        //构建图像的单词向量
        DBoW3::BowVector vA,vB,vC;
        vocab.transform(despA,vA );
        vocab.transform(despB,vB );
        vocab.transform(despC,vC );
        
        //比较各图片单词向量的相似度
        double scoreAB=vocab.score(vA, vB);
        double scoreAC=vocab.score(vA, vC);
        double scoreBC=vocab.score(vB, vC);
        double scoreAA=vocab.score(vA, vA);
        
        cout<<"scoreAB:"<<scoreAB<<endl;
        cout<<"scoreAC:"<<scoreAC<<endl;
        cout<<"scoreBC:"<<scoreBC<<endl;
        cout<<"scoreAA:"<<scoreAA<<endl;
        return 0;
    }

        代码中的A.png、B.png、C.png分别如下:

    C.jpg

        代码输出如下:

    Starting: /media/chen/chen/SLAM/projects_test/DBow3_test/build/dbow3_test
    scoreAB:0.214842
    scoreAC:0.0299757
    scoreBC:0.0276582
    scoreAA:1
    *** Exited normally ***

        可以看到A-B相似,因此得分较高,而A-C、B-C不相似,因此得分较低。

     

     

     

     

    展开全文
  • 针对室内环境中视觉同时定位与建图(simultaneous localization and mapping, SLAM)精度不高和实用性较差等问题,采用深度相机作为传感器,提出一种基于改进词袋模型的视觉SLAM算法。该算法通过增加节点距离的方式,对...
  • BOW词袋模型

    2019-10-28 20:56:16
    词袋模型(Bag-of-words model ,BoW model)最初被用在信息检索领域。该模型忽略文本的语法和语序,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的。BoW使用一组无序的单词(words)来表达一段文字...

    词袋模型(Bag-of-words model ,BoW model)最初被用在信息检索领域。该模型忽略文本的语法和语序,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的。BoW使用一组无序的单词(words)来表达一段文字或一个文档。

    例子:

    有三个句子如下:

    sentence1: Kid likes to watch movies. John likes too.
    sentence2: Kid also likes to watch football games.

    首先根据预料中的两个句子构建词袋:

    {"Kid": 1, "likes": 2,"to": 3, "watch": 4, "movies": 5,"also": 6, "football": 7, "games": 8,"John": 9, "too": 10}

    其中key为词,value为词的索引,预料中共有10个单词, 那么每个文本我们就可以使用一个10维的向量来表示。

    那么上述文本可以表示为:

    sentence1: [1, 2, 1, 1, 1, 0, 0, 0, 1, 1]
    
    sentence2: [1, 1, 1, 1, 0, 1, 1, 1, 0, 0]

    该向量与原来文本中单词出现的顺序没有关系,仅仅是词典中每个单词在文本中出现的频率。

    展开全文
  • 文本相似度-词袋模型

    千次阅读 2017-11-23 16:10:24
    1、词袋模型 将两篇文本通过词袋模型变为向量模型,通过计算向量的余弦距离来计算两个文本间的相似度。词袋模型的缺点: 词袋模型最重要的是构造词表,然后通过文本为词表中的词赋值,但词袋模型严重缺乏相似词...
  • DBoW3 视觉词袋模型-网络版,DBoW3 视觉词袋模型-网络版DBoW3 视觉词袋模型-网络版DBoW3 视觉词袋模型-网络版DBoW3 视觉词袋模型-网络版
  • 词袋模型BOVW

    2016-01-14 23:00:27
    视觉词袋(bag of view word),一个视觉词袋模型(bovw)的示例程序,用于给食物进行分类。C++实现。里面包含用作训练集和测试集的图片。源代码是linux系统下运行,所以需要额外下载dirent.h才能运行,已附在压缩包...
  • 词袋模型(视觉词袋模型BOVW)详解

    万次阅读 多人点赞 2018-11-06 22:00:29
    转自 ... 引言 最初的Bag of words,也叫做“词袋”,在信息检索中,Bag of words model假定对于一个文本,忽略其词序和语法,句法,将其仅仅看做是一个词集合,或...
  • 文档词袋模型

    2017-12-17 23:18:07
    词袋模型记录了单词在词汇表中出现的次数。def loadDataSet(): #创建文档集合以及标签 postingList = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], ['maybe', 'not', 'take', 'him', 'to', 'dog...
  • 基于内容的图像检索。通过Bag of Visual Words视觉词袋模型构建视觉词袋,实现以图搜图
  • 文中主要基于视觉词袋(BOVW, Bag-Of-Visual-Words)模型对图像进行分类处理,并对传统视觉词袋模型存在的不足进行了改进,提出了一种基于视觉词典的权重直方图来表达图像,采用优化的k-means聚类算法(k-means+)...
  • [翻译]词袋模型入门

    千次阅读 2017-10-15 05:26:59
    写在前面的话词袋模型在机器学习算法中通常用于表征文本数据。词袋模型非常容易理解并在语言模型和文本分类上取得了很大的成功。本文我们将探索词袋模型在自然语言处理特征提取任务中的应用。通过本文,可以了解到...
  • 一个视觉词袋模型(bovw)的示例程序,用于给食物进行分类。C++实现。里面包含用作训练集和测试集的图片。源代码是linux系统下运行,所以需要额外下载dirent.h才能运行,已附在压缩包里面。经测试效果比较令人满意。...
  • 词袋模型与TF-IDF

    2020-04-06 15:40:45
    词集与词袋模型 算法的主要作用也就是对文本做单词切分,有点从一篇文章里提取关键词这种意思,旨在用向量来描述文本的主要内容,其中包含了词集与词袋两种。 词集模型 DictVectorizer:单词构成的集合,集合中每个...
  • 词袋模型BoW和词集模型SoW比较

    千次阅读 2018-12-23 11:10:45
    Bag-of-Words词袋模型,经常用在自然语言处理和信息检索当中.在词袋模型中,一篇文本(文章)被表示成"装着词的袋子",也就是说忽略文章的词序和语法,句法;将文章看做词的组合,文中出现的每个词都是独立的,不...
  • NLP之词袋模型

    2019-08-18 21:58:25
    在NLP之词袋模型一中介绍了最基本利用词袋模型(Bag of Words)进行词向量表达对方法,本文介绍几种提升词袋模型性能的方法。 提升词袋模型性能的方法主要在以下几个方面: 词袋的管理 词向量表达方法的选择 词袋的...
  • 基于视觉词袋模型的人脸识别方法.pdf
  • 基于词袋模型图像分类算法研究.ppt
  • BoW词袋模型原理学习及Python实现

    千次阅读 2019-11-05 12:25:05
    文章目录BoW词袋模型原理为什么要用BoW模型描述图像构建BoW码本步骤编码测试 BoW词袋模型原理 BoW(Bag of Words)词袋模型最初被用在文本分类中,将文档表示成特征矢量。它的基本思想是假定对于一个文本,忽略其...
  • 这一小节,我们将介绍自然语言处理发展历史中的第一个模型 - 词袋模型。 1.词袋模型(Bag of words)的定义 词袋模型:顾名思义,就是把文章中的所有词语装入到一个袋子当中,装入袋子中的词语是没有重复的。 下面用
  • 基于词袋模型的shellcode检测,刘宇扬,芦天亮,随着网络服务服务的广泛流行,越来越多的攻击通过远程代码注入来威胁本地系统安全。shellcode是攻击者注入代码中实现攻击的核心代码,�
  • 视觉词典 词袋模型 有完整的介绍

    热门讨论 2012-05-21 16:56:32
    视觉词典 词袋模型 有完整的介绍 ,ppt文档,注意是ENGLISH WRITTEN
  • 单尺度词袋模型图像分类方法 希望大家可以共同学习
  • 基于词袋模型聚类的异常流量识别方法.pdf

空空如也

空空如也

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

词袋模型