我要用python 建一个快速的检索类网站 很小规模 如果有对此非常熟悉的 推荐一个框架

我要用python 建一个快速的检索类网站 很小规模 如果有对此非常熟悉的 推荐一个框架,第1张

一、引言

对于电商企业来说,搜索功能是其重中之重。这是买家进行购买的最便捷有效的途径。因此我们的搜索引擎也是公司最重要的产品。而搜索的关键是什么呢,自然是能够在第一时间明确用户的意图并给出与之相匹配的商品结果。所以怎么才能更好的理解用户,怎么能够在最快的时间内给到用户想要的结果,这便是我们在搜索实践中一直探讨优化的方向与目标。本文基于这一个月的进展做一个词向量在召回中的运用分析。

二、什么是词向量

在聊 Word2vec 之前,先聊聊 NLP (自然语言处理)。NLP 里面,最细粒度的是 词语,词语组成句子,句子再组成段落、篇章、文档。所以处理 NLP 的问题,首先就要从最基础的词语开始。

举个简单例子,判断一个词的词性,是动词还是名词。用机器学习的思路,我们有一系列样本(x,y),这里 x 是词语,y 是它们的词性,我们要构建 f(x)->y 的映射,但这里的数学模型 f(比如神经网络、SVM)只接受数值型输入,而 NLP 里的词语,是人类的抽象总结,是符号形式的(比如中文、英文、拉丁文等等),所以需要把他们转换成数值形式,或者说——嵌入到一个数学空间里,这种嵌入方式,就叫词嵌入(word embedding)。

one-hot 是可认为是最为简单的词向量,但存在维度灾难和语义鸿沟等问题;通过构建共现矩阵并利用 SVD 求解构建词向量,则计算复杂度高;而早期词向量的研究通常来源于语言模型,比如 NNLM 和 RNNLM,其主要目的是语言模型,而词向量只是一个副产物。

如上图的NNLM模型(2003年推出),它是为了计算某个句子出现的概率,我们可以加入相应的先验知识,用贝叶斯公式表示则是

将输入语料进行分词,并向量化(随机初始化成为一个N维的向量),然后将他们拼接起来作为输入,经过神经网络计算后预测出下个词是目标词的概率,通过反向传播优化模型参数后,我们不但得到了一个能够预测句子出现概率的模型,也得到了一份 词向量,相同上下文语境的词有相似语义,词与词之间的关联得到了极大的提升。 而由此引申出了 Word2vec、FastText,在此类词向量中,虽然其本质仍然是语言模型,但是它的目标并不是语言模型本身,而是词向量,其所作的一系列优化,都是为了更快更好的得到词向量。GloVe 则是基于全局语料库、并结合上下文语境构建词向量,结合了 LSA 和 Word2vec 的优点。(当然词向量模型远不止这些,其他模型和衍生场景这里不展开阐述,可以作为后续的专题进行分析)

如上图是我使用fasttext对天龙八部小说训练出的词向量模型,可以明显看出其中的人物集团之间的关系,这便是词向量之间的语义聚合效果,它的出现对于NLP后续的任务效果(如文本分类、NER、翻译等)都带来了极大的提升。

三、词向量在召回模型中的运用

随着平台用户体量和商品SKU的不断扩大,用户对于搜索场景的依赖也越来越大,提升召回率便是其中重要的一环,对此我们设计了一套方案,即利用词向量构建query语义表征,考虑到对未登录词的兼容性,这里使用了fasttext进行了词向量的训练。通过相似度计算和query热度加权推测无结果query的候选query集合,利用faiss进行在线实时高速计算,结合产品的优化实现对无结果query的再次召回,线上再结合多臂机的选择策略进一步提升容错和纠错能力。

我们分析整理了平台历史所有的query语料数据,结合商品描述信息使用迭代和半人工的方式优化了自有词库,在特征处理过程中,针对中英文分别做了处理,如英文增加了编辑距离纠错,中文由于短文本信息较少使用了单字进行切割等,针对性的进行了文本处理,相应的归一化了词分布,提升了部分模型训练效果。

训练参数如下:

query候选集预测结果部分如下,可以看到在没有做其他优化的前提下已经产生了一定的效果,后续我们还可以加入更多的策略进行融合进一步满足业务的场景:

四、未来的想象空间

针对平台业务及搜索场景,NLP还会有很多的结合点。

比如:

1对query做分类预测,我们可以预测每个query词的类目意图,品牌意图等,减少关键词搜索的歧义影响。

2搭建我们自己的NER命名实体模型,引导搜索的方向及准度

3针对海外市场,如何更好的利用国内积累下的搜索源数据,通过机器翻译的方式打通语言的壁垒

4作为个性化排序模型中的语义特征搭建完善个性化模型

5为运营及市场做用户热度挖掘及监控等

NLP作为人工智能技术的掌上明珠,虽然还处于刚起步和不断完善的阶段,但是只要合理运用好并能搭配其他策略进行完善,相信还有很多的价值等待我们去挖掘。

文本分类问题: 给定文档p(可能含有标题t),将文档分类为n个类别中的一个或多个

文本分类应用: 常见的有垃圾邮件识别,情感分析

文本分类方向: 主要有二分类,多分类,多标签分类

文本分类方法: 传统机器学习方法(贝叶斯,svm等),深度学习方法(fastText,TextCNN等)

本文的思路: 本文主要介绍文本分类的处理过程,主要哪些方法。致力让读者明白在处理文本分类问题时应该从什么方向入手,重点关注什么问题,对于不同的场景应该采用什么方法。

文本分类的处理大致分为 文本预处理 、文本 特征提取 分类模型构建 等。和英文文本处理分类相比,中文文本的预处理是关键技术。

针对中文文本分类时,很关键的一个技术就是中文分词。特征粒度为词粒度远远好于字粒度,其大部分分类算法不考虑词序信息,基于字粒度的损失了过多的n-gram信息。下面简单总结一下中文分词技术:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法 [1]。

1,基于字符串匹配的分词方法:

过程:这是 一种基于词典的中文分词 ,核心是首先建立统一的词典表,当需要对一个句子进行分词时,首先将句子拆分成多个部分,将每一个部分与字典一一对应,如果该词语在词典中,分词成功,否则继续拆分匹配直到成功。

核心: 字典,切分规则和匹配顺序是核心。

分析:优点是速度快,时间复杂度可以保持在O(n),实现简单,效果尚可;但对歧义和未登录词处理效果不佳。

2, 基于理解的分词方法:基于理解的分词方法是通过让计算机模拟人对句子的理解 ,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统 还处在试验阶段

3,基于统计的分词方法:

过程:统计学认为分词是一个 概率最大化问题 ,即拆分句子,基于语料库,统计 相邻的字组成的词语出现的概率 ,相邻的词出现的次数多,就出现的概率大, 按照概率值进行分词 ,所以一个完整的语料库很重要。

主要的统计模型有: N元文法模型(N-gram),隐马尔可夫模型(Hidden Markov Model ,HMM),最大熵模型(ME),条件随机场模型(Conditional Random Fields,CRF)等。

1, 分词 : 中文任务分词必不可少,一般使用jieba分词,工业界的翘楚。

2, 去停用词:建立停用词字典 ,目前停用词字典有2000个左右,停用词主要包括一些副词、形容词及其一些连接词。通过维护一个停用词表,实际上是一个特征提取的过程,本质 上是特征选择的一部分。

3, 词性标注 : 在分词后判断词性(动词、名词、形容词、副词…),在使用jieba分词的时候设置参数就能获取。

文本分类的核心都是如何从文本中抽取出能够体现文本特点的关键特征,抓取特征到类别之间的映射。 所以特征工程很重要,可以由四部分组成:

1,基于词袋模型的特征表示:以词为单位(Unigram)构建的词袋可能就达到几万维,如果考虑二元词组(Bigram)、三元词组(Trigram)的话词袋大小可能会有几十万之多,因此基于词袋模型的特征表示通常是极其稀疏的。

(1)词袋特征的方法有三种:

(2)优缺点:

2,基于embedding的特征表示: 通过词向量计算文本的特征。(主要针对短文本)

4,基于任务本身抽取的特征:主要是针对具体任务而设计的,通过我们对数据的观察和感知,也许能够发现一些可能有用的特征。有时候,这些手工特征对最后的分类效果提升很大。举个例子,比如对于正负面评论分类任务,对于负面评论,包含负面词的数量就是一维很强的特征。

5,特征融合:对于特征维数较高、数据模式复杂的情况,建议用非线性模型(如比较流行的GDBT, XGBoost);对于特征维数较低、数据模式简单的情况,建议用简单的线性模型即可(如LR)。

6,主题特征:

LDA(文档的话题): 可以假设文档集有T个话题,一篇文档可能属于一个或多个话题,通过LDA模型可以计算出文档属于某个话题的概率,这样可以计算出一个DxT的矩阵。LDA特征在文档打标签等任务上表现很好。

LSI(文档的潜在语义): 通过分解文档-词频矩阵来计算文档的潜在语义,和LDA有一点相似,都是文档的潜在特征。

这部分不是重点,传统机器学习算法中能用来分类的模型都可以用,常见的有:NB模型,随机森林模型(RF),SVM分类模型,KNN分类模型,神经网络分类模型。

这里重点提一下贝叶斯模型,因为工业用这个模型用来识别垃圾邮件[2]。

1,fastText模型: fastText 是word2vec 作者 Mikolov 转战 Facebook 后16年7月刚发表的一篇论文: Bag of Tricks for Efficient Text Classification [3]。

模型结构:

改进:注意力(Attention)机制是自然语言处理领域一个常用的建模长时间记忆机制,能够很直观的给出每个词对结果的贡献,基本成了Seq2Seq模型的标配了。实际上文本分类从某种意义上也可以理解为一种特殊的Seq2Seq,所以考虑把Attention机制引入近来。

过程:

利用前向和后向RNN得到每个词的前向和后向上下文的表示:

词的表示变成词向量和前向后向上下文向量连接起来的形式:

模型显然并不是最重要的: 好的模型设计对拿到好结果的至关重要,也更是学术关注热点。但实际使用中,模型的工作量占的时间其实相对比较少。虽然再第二部分介绍了5种CNN/RNN及其变体的模型,实际中文本分类任务单纯用CNN已经足以取得很不错的结果了,我们的实验测试RCNN对准确率提升大约1%,并不是十分的显著。最佳实践是先用TextCNN模型把整体任务效果调试到最好,再尝试改进模型。

理解你的数据: 虽然应用深度学习有一个很大的优势是不再需要繁琐低效的人工特征工程,然而如果你只是把他当做一个黑盒,难免会经常怀疑人生。一定要理解你的数据,记住无论传统方法还是深度学习方法,数据 sense 始终非常重要。要重视 badcase 分析,明白你的数据是否适合,为什么对为什么错。

超参调节: 可以参考 深度学习网络调参技巧 - 知乎专栏

一定要用 dropout: 有两种情况可以不用:数据量特别小,或者你用了更好的正则方法,比如bn。实际中我们尝试了不同参数的dropout,最好的还是05,所以如果你的计算资源很有限,默认05是一个很好的选择。

未必一定要 softmax loss: 这取决与你的数据,如果你的任务是多个类别间非互斥,可以试试着训练多个二分类器,也就是把问题定义为multi lable 而非 multi class,我们调整后准确率还是增加了>1%。

类目不均衡问题: 基本是一个在很多场景都验证过的结论:如果你的loss被一部分类别dominate,对总体而言大多是负向的。建议可以尝试类似 booststrap 方法调整 loss 中样本权重方式解决。

避免训练震荡: 默认一定要增加随机采样因素尽可能使得数据分布iid,默认shuffle机制能使得训练结果更稳定。如果训练模型仍然很震荡,可以考虑调整学习率或 mini_batch_size。

知乎的文本多标签分类比赛,给出第一第二名的介绍网址:

NLP大赛冠军总结:300万知乎多标签文本分类任务(附深度学习源码)

2017知乎看山杯 从入门到第二

1、不同词语之间的意义相关性,包括同义词,反义词的分析等等。这个可以用词向量的办法,设定一些基准意义向量,把要分析的词语用这些向量表达出来,然后利用向量夹角分析词语意义的相关性(相似性)。

2、两个词之间的依存语义关系。这个我并不了解,只是知道有这样一种办法。

3、常用词语的特定搭配(collocation)。这种相关性可以用语料库分析一个词的临近词,包括间隔一个词的临近词。可以自建语料库,也可以使用在线的语料库。

NLP是人工智能的一个子领域,作为AI产品经理,我们至少要知道NLP是什么,它能做什么事,这样我们就能获得一种解决问题的思维,将遇到的问题和方法连接起来。接下来我从“NLP是什么、能做什么、目前遇到的难题”三个方面来简单介绍下NLP。

一.什么是NLP

NLP,中文叫自然语言处理,简单来说,是一门让计算机理解、分析以及生成自然语言的学科,大概的研究过程是:研制出可以表示语言能力的模型——提出各种方法来不断提高语言模型的能力——根据语言模型来设计各种应用系统——不断地完善语言模型。

NLP理解自然语言目前有两种处理方式:

1基于规则来理解自然语言,即通过制定一些系列的规则来设计一个程序,然后通过这个程序来解决自然语言问题。输入是规则,输出是程序;

2基于统计机器学习来理解自然语言,即用大量的数据通过机器学习算法来训练一个模型,然后通过这个模型来解决自然语言问题。输入是数据和想要的结果,输出是模型。

接下来简单介绍NLP常见的任务或应用。

二.NLP能做什么:

1分词

中文可以分为字、词、短语、句子、段落、文档这几个层面,如果要表达一个意思,很多时候通过一个字是无法表达的一个含义的,至少一个词才能更好表达一个含义,所以一般情况是以“词”为基本单位,用“词”组合来表示“短语、、句子、段落、文档”,至于计算机的输入是短语或句子或段落还是文档就要看具体的场景。由于中文不像英文那样词与词之间用空格隔开,计算机无法用区分一个文本有哪些词,所以要进行分词。目前分词常用的方法有两种:

(1)基于规则:Heuristic(启发式)、关键字表

(2)基于机器学习/统计方法:HMM(隐马尔科夫模型)、CRF(条件随机场)

(注:在这里就不具体介绍方法的原理和实现过程了,大家感兴趣,可以自行百度了解)

现状分词这项技术非常成熟了,分词的准确率已经达到了可用的程度,也有很多第三方的库供我们使用,比如jieba,所以一般在实际运用中我们会采用“jieba+自定义词典”的方式进行分词。

2词编码

现在把“我喜欢你”这个文本通过分词分成“我”、“喜欢”、“你”三个词,此时把这三词作为计算机的输入,计算机是无法理解的,所以我们把这些词转换成计算机能理解的方式,即词编码,现在普遍是将词表示为词向量,来作为机器学习的输入和表示空间。目前有两种表示空间:

(1)离散表示:

AOne-hot表示

假设我们的语料库是:

我喜欢你你对我有感觉吗

词典{“我”:1,“喜欢”:2,“你”:3,“对“:4,“有”:5,“感觉”:6,“吗”:7} 。一共有七个维度。

所以用One-hot表示:

“我”  :[1, 0, 0, 0, 0, 0, 0]

“喜欢”:[0, 1, 0, 0, 0, 0, 0]

········

“吗”  :[0, 0, 0, 0, 0, 0, 1]

即一个词用一个维度表示

Bbag of word:即将所有词的向量直接加和作为一个文档的向量。

所以“我 喜欢 你”就表示为:“[1, 1, 1, 0, 0, 0, 0]”。

C Bi-gram和N-gram(语言模型):考虑了词的顺序,用词组合表示一个词向量。

这三种方式背后的思想是:不同的词都代表着不同的维度,即一个“单位”(词或词组合等)为一个维度。

(2)分布式表示:word2vec,表示一个共现矩阵向量。其背后的思想是“一个词可以用其附近的词来表示”。

离散式或分布式的表示空间都有它们各自的优缺点,感兴趣的读者可以自行查资料了解,在这里不阐述了。这里有一个问题,当语料库越大时,包含的词就越多,那词向量的维度就越大,这样在空间储存和计算量都会指数增大,所以工程师在处理词向量时,一般都会进行降维,降维就意味着部分信息会丢失,从而影响最终的效果,所以作为产品经理,跟进项目开发时,也需要了解工程师降维的合理性。

3自动文摘

自动文摘是指在原始文本中自动摘要出关键的文本或知识。为什么需要自动文摘?有两个主要的原因:(1)信息过载,我们需要在大量的文本中抽出最有用、最有价值的文本;(2)人工摘要的成本非常高。目前自动文摘有两种解决思路:第一种是extractive(抽取式),从原始文本中找到一些关键的句子,组成一篇摘要;另一种方式是abstractive(摘要式),计算机先理解原始文本的内容,再用自己的意思将其表达出来。自动文摘技术目前在新闻领域运用的最广,在信息过载的时代,用该技术帮助用户用最短的时间了解最多、最有价值的新闻。此外,如何在非结构的数据中提取结构化的知识也将是问答机器人的一大方向。

4实体识别

实体识别是指在一个文本中,识别出具体特定类别的实体,例如人名、地名、数值、专有名词等。它在信息检索、自动问答、知识图谱等领域运用的比较多。实体识别的目的就是告诉计算机这个词是属于某类实体,有助于识别出用户意图。比如百度的知识图谱:

“周星驰多大了”识别出的实体是“周星驰”(明星实体),关系是“年龄”,搜索系统可以知道用户提问的是某个明星的年龄,然后结合数据“周星驰  出生时间  1962年6月22日”以及当前日期来推算出周星驰的年龄,并把结果直接把这个结果显示给用户,而不是显示候选答案的链接。

此外,NLP常见的任务还有:主题识别、机器翻译、文本分类、文本生成、情感分析、关键字提取、文本相似度等,以后有时间再为大家做简单介绍。

三.NLP目前存在的难点

1语言不规范,灵活性高

自然语言并不规范,虽然可以找一些基本规则,但是自然语言太灵活了,同一个意思可以用多种方式来表达,不管是基于规则来理解自然语言还是通过机器学习来学习数据内在的特征都显得比较困难。

2错别字

在处理文本时,我们会发现有大量的错别字,怎么样让计算机理解这些错别字想表达的真正含义,也是NLP的一大难点

3新词

我们处在互联网高速发展的时代,网上每天都会产生大量的新词,我们如何快速地发现这些新词,并让计算机理解也是NLP的难点

4用词向量来表示词依然存在不足

上述,我们讲到,我们是通过词向量来让计算机理解词,但是词向量所表示的空间,它是离散,而不是连续,比如表示一些正面的词:好,很好,棒,厉害等,在“好”到“很好”的词向量空间中,你是不能找到一些词,从“好”连续到“很好”,所以它是离散、不连续的,不连续最大的问题就是不可导计算机是处理可导的函数非常容易,不可导的话,计算量就上来了。当然现在也有一些算法是计算词向量做了连续近似化,但这肯定伴随着信息的损失。总之,词向量并不是最好的表示词的方式,需要一种更好的数学语言来表示词,当然可能我们人类的自然语言本身就是不连续的,或者人类无法创建出“连续”的自然语言。

小结:通过上述的内容,我们已经大概知道了“NLP是什么、能做什么以及目前存在的难题”。作为人工智能产品经理,了解NLP技术能够提高我们自己的技术理解力,在理解行业需求、推进项目开展都有非常大的帮助,其实这可以让我们获得是一种连接能力,将需求与工程师连接起来,将问题与解决方案连接起来。虽然NLP等人工智能技术存在很多不足,但我们需要调整好自己的心态,人工智能应用化才刚刚开始,必然是不够完美的,不要成为批判者,而是成为人工智能时代的推进者。

nt-sizf@�2W��

以上就是关于我要用python 建一个快速的检索类网站 很小规模 如果有对此非常熟悉的 推荐一个框架全部的内容,包括:我要用python 建一个快速的检索类网站 很小规模 如果有对此非常熟悉的 推荐一个框架、图解BERT模型结构输入输出、NLP技术在搜索中的应用方向等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10172958.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存