1.词袋模型是什么意思
Bag of words,也叫做“词袋”,在信息检索中,Bag of words model假定对于一个文本,忽略其词序和语法,句法,将其仅仅看做是一个词集合,或者说是词的一个组合,文本中每个词的出现都是独立的,不依赖于其他词是否出现,或者说当这篇文章的作者在任意一个位置选择一个词汇都不受前面句子的影响而独立选择的。
这种假设虽然对自然语言进行了简化,便于模型化,但是其假定在有些情况下是不合理的,例如在新闻个性化推荐中,采用Bag of words的模型就会出现问题。例如用户甲对“南京醉酒驾车事故”这个短语很感兴趣,采用bag of words忽略了顺序和句法,则认为用户甲对“南京”、“醉酒”、“驾车”和“事故”感兴趣,因此可能推荐出和“南京”,“公交车”,“事故”相关的新闻,这显然是不合理的。
2.bag
最初的Bag of words,也叫做“词袋”,在信息检索中,Bag of words model假定对于一个文本,忽略其词序和语法,句法,将其仅仅看做是一个词集合,或者说是词的一个组合,文本中每个词的出现都是独立的,不依赖于其他词 是否出现,或者说当这篇文章的作者在任意一个位置选择一个词汇都不受前面句子的影响而独立选择的.现在Computer Vision中的Bag of words来表示图像的特征描述也是很流行的.大体思想是这样的,假设有5类图像,每一类中有10幅图像,这样首先对每一幅图像划分成patch(可以是 刚性分割也可以是像SIFT基于关键点检测的),这样,每一个图像就由很多个patch表示,每一个patch用一个特征向量来表示,咱就假设用Sift 表示的,一幅图像可能会有成百上千个patch,每一个patch特征向量的维数128.接下来就要进行构建Bag of words模型了,假设Dictionary词典的Size为100,即有100个词.那么咱们可以用K-means算法对所有的patch进行聚 类,k=100,我们知道,等k-means收敛时,我们也得到了每一个cluster最后的质心,那么这100个质心(维数128)就是词典里德100 个词了,词典构建完毕.词典构建完了怎么用呢?是这样的,先初始化一个100个bin的初始值为0的直方图h.每一幅图像不是有很多patch么?我们就再次 计算这些patch和和每一个质心的距离,看看每一个patch离哪一个质心最近,那么直方图h中相对应的bin就加1,然后计算完这幅图像所有的 patches之后,就得到了一个bin=100的直方图,然后进行归一化,用这个100维德向量来表示这幅图像.对所有图像计算完成之后,就可以进行分 类聚类训练预测之类的了.。
3.词袋模型有什么作用
BOW ModelBag-of-words model (BoW model) 最早出现在自然语言处理(Natural Language Processing)和信息检索(Information Retrieval)领域.。
该模型忽略掉文本的语法和语序等要素,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的。BoW使用一组无序的单词(words)来表达一段文字或一个文档.。
近年来,BoW模型被广泛应用于计算机视觉中,与应用于文本的BoW 类比,图像的特征(feature)被当作单词(Word)。基于文本的BoW模型的一个简单例子如下:首先给出两个简单的文本文档如下:John likes to watch movies. Mary likes too.John also likes to watch football games.基于上述两个文档中出现的单词,构建如下一个词典 (dictionary):{“John”: 1, “likes”: 2,”to”: 3, “watch”: 4, “movies”: 5,”also”: 6, “football”: 7, “games”: 8,”Mary”: 9, “too”: 10}上面的词典中包含10个单词, 每个单词有唯一的索引, 那么每个文本我们可以使用一个10维的向量来表示。
如下:[1, 2, 1, 1, 1, 0, 0, 0, 1, 1][1, 1, 1, 1, 0, 1, 1, 1, 0, 0]该向量与原来文本中单词出现的顺序没有关系,而是词典中每个单词在文本中出现的频率。因此BoW模型可认为是一种统计直方图 (histogram)。
4.如何设计好词袋模型的类类型
如何设计好词袋模型的类类型回顾过去自己写过的一些词袋模型,比如 BoW图像检索Python实战 、图像检索(CBIR)三剑客之BoF、VLAD、FV 以及Bag of Words cpp实现,这些写出来的要么只是助于自己理解词袋模型的有关理论,要么也只是面向实验的一些验证,或者更直接点可以说只是些小玩具摆了。
在我2016年的计划列表里,存放着一条由2015年拖过来的目标,就是写出一个可以面向商业级别的词袋模型,这条计划伴随着成功将VLfeat的一些c接口打通而变成了可能,并且在过去的大半年里,自己也一直留意在具体编写的时候选用哪些库比较合适的问题。机缘巧合,这一段时间又重新开始造起了轮子,并有了初步的成功,所以在此梳理总结一下。
在谈怎样设计一个词袋模型的类类型之前,先谈谈库的选用问题。选取合适的库在具体编写一个面向应用级别的词袋模型的时候,大概会经历这么几个步骤:SIFT特征抽取,特征采样,聚类,构建KD树,统计词频,计算词频权重,计算词频直方图,保存数据。
这8个步骤在具体实现的时候,会设计到一些库的选取问题,下面对其进行细谈。1) SIFT特征抽取提取选用哪个库?提取SIFT的库有很多,主要有以下几个大家用得比较多:Lowe的 SIFT ,效果只提供SIFT的二进制可执行文件,弃用;Robwhess的 OpenSIFT ,开源,效果也还不错,需要一些别的依赖库,不再更新,弃用;OpenCV的SIFT,这个当然在使用上是最方便的,文档全,不依赖别的库,但SIFT的实现效果并不是很好,弃用;VLfeat里的 SIFT ,SIFT的实现效果是比较好的,缺点是c接口文档不怎么全,网上提供的资料也比较少,但多读读它的C源码,还是可以搞定的,而且在不用依赖其他的库,所以选择这个库来提取SIFT还是很好的,在实际提取的时候,我选用的是 covdet 函数来提取SIFT,它是一个功能更强大的提取co-variant特征提取器。
在去年的时候,基本弄清了VLfeat中的一些函数的C接口调用方式,covdet这个函数通过阅读写给matlab的接口源码转成的C,对比matlab提取的结果和自己转成C之后提取的结果,两者完全一致。2) 矩阵运算库的选取虽然使用矩阵操作并不是必须的,除了OpenCV的矩阵,还有可能引入其他的矩阵运算库,这些矩阵的引入会给后面的实现带来巨大的方便,比如聚类,KD树的构建以及后面词频统计等。
作为运算的基础库,在矩阵库的选择上主要有下面几个用得比较多:Eigen ,使用的只需要把头文件包含进工程里即可,提供了多个平台的版本,比如可以运行于安卓上,矩阵运算操作还是比较方便的,更新得比较快,不过在PC平台上开发,我比较倾向于使用下面要说的Armadillo。Armadillo ,这个库是我非常喜欢的矩阵运算库,此矩阵库在使用语法上Matlabjie借鉴了Matlab的语法使用习惯,所以熟悉Matlab的开发者在使用此库的时候会觉得非常的舒服,并且有名的MLPack是建立在它的基础之上,另外它的矩阵运算效率也是非常高的,使用的时候同Eigen一样只需要包含头文件目录即可,最新版本中添加了KMeans聚类。
因而,基于以上这些优点,在实现词袋模型的时候,对于矩阵运算库的选取,选择这个无疑是最优的。选用矩阵库虽然能极大的方便我们的程序编写,但是会涉及到数据类型的转换,比如STL的vector存储的数据要转成Armadillo的矩阵进行运算,如果数据频繁的进行类型的转换,必然会降低程序的运行效率,因而在程序的编写中,不必要转换的尽量避免转换。
3) 多线程并行处理为了使程序的SIFT特征提取、KMeans聚类、统计词频等过程支持并行处理,在选择并行计算库的时候,有两种选择,一种是采用OpenMP,另一种是选择MPI。OpenMP是采用的是内存共享的方式,只需要对原程序进行小幅调整即可实现并行处理,并且语法易读已写;MPI需要对原来的程序进行大幅重构,写出来的代码也不是很好读。
所以,在多线程并处计算库选择这块,选择OpenMP是比较好的。词袋模型的类类型设计终于可以讲核心的了,这一部分讲讲在编写程序的时候自己对词袋模型的类类型设计的一点心得。
先上自己写的词袋模型的类类型,设计了两个类,一个是 SIFT特征提取的类类型 ,另一个是 词袋模型的类类型 。先谈谈 SIFT特征提取的类类型 :class siftDesctor{public:siftDesctor(){};std::string imageName;std::vector> frame;std::vector> desctor;void covdet_keypoints_and_descriptors(cv::Mat &img, std::vector> &frames, std::vector> &desctor, bool rooSIFT, bool verbose);std::vector rootsift(std::vector &dst);void Serialize(std::ofstream &outfile) const {std::string tmpImageName = imageName;int strSize = (int)imageName.size();outfile.write((char *)&strSize, sizeof(int));outfile.write((char *)&tmpImageName[0], sizeof(char)*strSize); // 写入文件名int descSize = (int)desctor.size();outfile.write((char *)&descSize, sizeof(int));// 写入sift特征for(int i = 0; i tmpDesc(128);ifs.read((char *)&(tmpDesc[0]), sizeof(float) * 128);siftDesc.desctor.push_back(tmpDesc);std::vector tmpFrame(6);ifs.read((char *)&(tmpFrame[0]), sizeof(float) * 6);siftDesc。
5.机器学习句子相似度计算,最后怎么根据相似度高低排序返回原来的句
先说一个还是从词的角度出发考虑的,最后的效果非常好,就是怎么样从词的向量得到句子的向量,首先选出一个词库,比如说10万个词,然后用w2v跑出所有词的向量,然后对于每一个句子,构造一个10万维的向量,向量的每一维是该维对应的词和该句子中每一个词的相似度的最大值。这种方法实际上是bag of words的一个扩展,比如说对于 我喜欢用苹果手机 这么一句话,对应的向量,会在三星,诺基亚,小米,电脑等词上也会有比较高的得分。这种做法对于bag of words的稀疏性问题效果非常好。
还做过一个直接训练句子的相似度的一个query2vec模型,效果也不错,就不细说了。
6.fisher准则函数和lda有什么区别
Fisher判别的基本思路就是投影,针对P维空间中的某点x=(x1,x2,x3,…,xp)寻找一个能使它降为一维数值的线性函数y(x):
y(x)= ∑Cjxj
然后应用这个线性函数把P维空间中的已知类别总体以及求知类别归属的样本都变换为一维数据,再根据其间的亲疏程度把未知归属的样本点判定其归属。这个线性函数应该能够在把P维空间中的所有点转化为一维数值之后,既能最大限度地缩小同类中各个样本点之间的差异,又能最大限度地扩大不同类别中各个样本点之间的差异,这样才可能获得较高的判别效率。在这里借用了一元方差分析的思想,即依据组间均方差与组内均方差之比最大的原则。
LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。[1] LDA是一种非监督机器学习技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息。它采用了词袋(bag of words)的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。但是词袋方法没有考虑词与词之间的顺序,这简化了问题的复杂性,同时也为模型的改进提供了契机。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。
7.如何利用深度学习技术训练聊天机器人语言模型
数据预处理 模型能聊的内容也取决于选取的语料。
如果已经具备了原始聊天数据,可以用SQL通过关键字查询一些对话,也就是从大库里选取出一个小库来训练。从一些论文上,很多算法都是在数据预处理层面的,比如Mechanism-Aware Neural Machine for Dialogue Response Generation就介绍了,从大库中抽取小库,然后再进行融合,训练出有特色的对话来。
对于英语,需要了解NLTK,NLTK提供了加载语料,语料标准化,语料分类,PoS词性标注,语意抽取等功能。另一个功能强大的工具库是CoreNLP,作为 Stanford开源出来的工具,特色是实体标注,语意抽取,支持多种语言。
下面主要介绍两个内容:中文分词 现在有很多中文分词的SDK,分词的算法也比较多,也有很多文章对不同SDK的性能做比较。做中文分词的示例代码如下。
# coding:utf8''' Segmenter with Chinese ''' import jieba import langid def segment_chinese_sentence(sentence):''' Return segmented sentence.''' seg_list = jieba.cut(sentence, cut_all=False) seg_sentence = u" ".join(seg_list) return seg_sentence.strip().encode('utf8') def process_sentence(sentence):''' Only process Chinese Sentence.''' if langid.classify(sentence)[0] == 'zh':return segment_chinese_sentence(sentence) return sentence if __name__ == "__main__":print(process_sentence('飞雪连天射白鹿')) print(process_sentence('I have a pen.')) 以上使用了langid先判断语句是否是中文,然后使用jieba进行分词。在功能上,jieba分词支持全切分模式,精确模式和搜索引擎模式。
全切分:输出所有分词。精确:概率上的最佳分词。
所有引擎模式:对精确切分后的长句再进行分词。jieba分词的实现 主要是分成下面三步:1、加载字典,在内存中建立字典空间。
字典的构造是每行一个词,空格,词频,空格,词性。上诉书 3 n 上诉人 3 n 上诉期 3 b 上诉状 4 n 上课 650 v 建立字典空间的是使用python的dict,采用前缀数组的方式。
使用前缀数组的原因是树结构只有一层 - word:freq,效率高,节省空间。比如单词"dog", 字典中将这样存储:{"d": 0,"do": 0,"dog": 1 # value为词频 } 字典空间的主要用途是对输入句子建立有向无环图,然后根据算法进行切分。
算法的取舍主要是根据模式 - 全切,精确还是搜索。2、对输入的语句分词,首先是建立一个有向无环图。
有向无环图, Directed acyclic graph (音 /?d?ɡ/)。【图 3-2】 DAG DAG对于后面计算最大概率路径和使用HNN模型识别新词有直接关系。
3、按照模式,对有向无环图进行遍历,比如,在精确模式下,便利就是求最大权重和的路径,权重来自于在字典中定义的词频。对于没有出现在词典中的词,连续的单个字符也许会构成新词。
然后用HMM模型和Viterbi算法识别新词。精确模型切词:使用动态规划对最大概率路径进行求解。
最大概率路径:求route = (w1, w2, w3 ,.., wn),使得Σweight(wi)最大。Wi为该词的词频。
更多的细节还需要读一下jieba的源码。自定义字典 jieba分词默认的字典是:1998人民日报的切分语料还有一个msr的切分语料和一些txt小说。
开发者可以自行添加字典,只要符合字典构建的格式就行。jieba分词同时提供接口添加词汇。
Word embedding 使用机器学习训练的语言模型,网络算法是使用数字进行计算,在输入进行编码,在输出进行解码。word embedding就是编解码的手段。
【图 3-3】 word embedding, Ref. #7 word embedding是文本的数值化表示方法。表示法包括one-hot,bag of words,N-gram,分布式表示,共现矩阵等。
Word2vec 近年来,word2vec被广泛采用。Word2vec输入文章或者其他语料,输出语料中词汇建设的词向量空间。
详细可参考word2vec数学原理解析。使用word2vec 安装完成后,得到word2vec命令行工具。
word2vec -train "data/review.txt" \-output "data/review.model" \-cbow 1 \-size 100 \-window 8 \-negative 25 \-hs 0 \-sample 1e-4 \-threads 20 \-binary 1 \-iter 15-train "data/review.txt" 表示在指定的语料库上训练模型-cbow 1 表示用cbow模型,设成0表示用skip-gram模型-size 100 词向量的维度为100-window 8 训练窗口的大小为8 即考虑一个单词的前八个和后八个单词-negative 25 -hs 0 是使用negative sample还是HS算法-sample 1e-4 采用阈值-threads 20 线程数-binary 1 输出model保存成2进制-iter 15 迭代次数 在训练完成后,就得到一个model,用该model可以查询每个词的词向量,在词和词之间求距离,将不同词放在数学公式中计算输出相关性的词。比如:vector("法国") - vector("巴黎) + vector("英国") = vector("伦敦")" 对于训练不同的语料库,可以单独的训练词向量模型,可以利用已经训练好的模型。
其它训练词向量空间工具推荐:Glove。Seq2Seq2014年,Sequence to Sequence Learning with Neural Networks提出了使用深度学习技术,基于RNN和LSTM网络训练翻译系统,取得了突破,这一方法便应用在更广泛的领域,比如问答系统,图像字幕,语音识别,撰写诗词等。
Seq2Seq完成了【encoder + decoder -。
8.如何对SIFT得到的特征向量做k
关于SIFT之后的K-means聚类的问题
本人在做bag of words这个模型,选择的是SIFT+SVM,中间涉及到聚类分析,想用K-means算法做聚类
现在的问题是,假设我用100张学习图片做SIFT特征提取,每张图片都是N*128的向量,并且每张图片的特征点N不同
那么在做K-means聚类的时候,是每一张图片分别作聚类,还是将100张图片的特征空间整合成(N1+N2+。+N100)*128的矩阵,再做聚类?
因为我用的是matlab自带的kmeans函数,如果是第二种情况,聚类后假设质点k取300,那么想分别得到每一张图片中属于各个质点的特征点有多少个要怎么实现?
另:MATLAB中自带kmeans函数说明如下:
[IDX,C] = kmeans(X,k) returns the k cluster centroid locations in the k-by-p matrix C.
[IDX,C,sumd] = kmeans(X,k) returns the within-cluster sums of point-to-centroid distances in the 1-by-k vector sumd.
[IDX,C,sumd,D] = kmeans(X,k) returns distances from each point to every centroid in the n-by-k matrix D.
本人也是昨天才看到聚类算法,许多不清楚,希望大虾指点,万分谢谢~~
这位童鞋,你显然没有实质上的理解BoW Model,更不用说BoF Model了。建议你先搞清楚BoW ,结合BoW,再去理解BoF 。这样就很容易理解了。首先,对你指出你的两个问题。第一,使用100幅图片来做机器学习是远远不够的,至少要200以上,这样才能有质的效果;第二,即使是只使用100幅图片,使用matlab自带的kmeans函数,如果你的电脑内存是2G,win7系统,肯定会产生Out of Memeroy的问题。对于你提出的问题,显然是应该把你那100图片的所有SIFT特征点向量散布于一个128D的空间中来进行聚类,这样才能真正的找到每幅图片中的相似点,你放在一幅图片里面聚类,那机器能学到啥子哦~~这就是模式识别里面的机器学习啦,我是西电的,欢迎交流~~
你可以大概的算一下那些矩阵的大小,估计都七八百M了,内存也不可能全部分给matlab,系统就占了好多,肯定会有内存溢出的问题
kmeans中idx记录的是每个点的聚类标号,还要提前记录每幅图得到的关键点的个数,这样就可以循环找到每幅图对应的特征点的个数了
转载请注明出处51数据库 » bagofwords模型
方丈久居怡红院