莫烦NLP学习笔记--01搜索

搜索引擎如何工作

构建索引

搜索引擎不会储存一篇文章的所有信息,而是挑选重点比如标题、时间、正文等信息给予不同权重存储起来。
搜索引擎在搜索的时候,不会临时从全网找材料,而是将刚刚收集到的信息提前构建成索引,存储在便于快速检索的数据库中。只在自己的数据库中搜索,使及时搜索更有效率。

数值匹配搜索

文字和图片视频等信息都可以被深度学习网络转换为统一的数字形态,对比相似性就可以实现多模态搜索。

搜索过滤

由于深度学习速度较慢,先使用更传统的方法过滤,在后续步骤中再使用深度学习。
在这里插入图片描述

正排/倒排索引—批量召回技术

例子:假设你开了家咨询公司,手上有100篇材料。这时有人来找你咨询NLP的问题,你会怎么在这100篇材料中找到合适的内容呢
正排:一篇一篇地阅读,找到所有包含NLP内容的材料,然后返回给提问者,效率非常差。
倒排:第一次拿到所有材料时就通读一遍,构建关键词和文章的对应关系。之后每次做的工作就是匹配词语+返回索引材料。在海量数据时,若能对这些文章进行排序,再选取排名靠前的文章列表就很不错了,这里可以使用TF-IDF算法。

TF-IDF—处理匹配排序在这里插入图片描述

TF(词频)和IDF(逆文本频率指数)理解:
我们可能要找到文章中的关键词与搜索问题中的词进行对比,那么如何找到一篇文章的关键词?
(1)越重要的内容,强调的次数也越多,所以频率(TF)会大,我们可以用词频高的词代表这篇文章。所以TF可以用一张词和文章标号的表来展示。
(2)像语气词或“你我他”这种词并不是关键词,但同样也会出现很多次,而TF-IDF中的IDF,就可以在这个时候帮上忙,它是所有词在这个系统中的区分力的大小,如果每篇文章里都有“我”这个字,那么它的在任意一篇文章当中的区分力都不强,IDF就小。
如果说TF是以文章为中心的局部词信息,那么IDF则是全局的词信息,相互结合就能用TF-IDF信息来表达一篇文章啦。
在这里插入图片描述

相互结合其实就是两者相乘,每篇文章就是的TF-IDF表示就是一串数字构成的向量,这个示意里一篇文章用一个四维向量表示。比如第一篇,虽然TF告诉我们文章中“爱”这个字最多,但是IDF却告诉我们“莫烦”在文章中更具有代表性,所以根据TF-IDF的结合,这篇文章更具有“莫烦”属性。

在这里插入图片描述
搜索关键词“莫烦Python”的实质:比较问句的四维向量和哪篇文章的四维向量在四维空间里的cosine距离最近(这里使用了三维空间来作图说明)。

搜索扩展

TF-IDF矩阵太大,有一种节约内存的技术,叫做Sparse Matrix,稀疏矩阵,它只会存储有内容的值,而忽略无内容的值。 在这张巨大的二维表中,肯定每篇文章不一定会提及到所有词汇,这些不提及的词汇,我们当然可以不用存储

sklearn实现TF-IDF和稀疏矩阵

还是以上节内容的 made up 文档举例,如果直接调用 sklearn 的TF-IDF 功能,会方便很多,引用下面两个功能。

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

docs = [
    "it is a good day, I like to stay here",
    "I am happy to be here",
    "I am bob",
    "it is sunny today",
    "I have a party today",
    "it is a dog and that is a cat",
    "there are dog and cat on the tree",
    "I study hard this morning",
    "today is a good day",
    "tomorrow will be a good day",
    "I like coffee, I like book and I like apple",
    "I do not like it",
    "I am kitty, I like bob",
    "I do not care who like bob, but I like kitty",
    "It is coffee time, bring your cup",
]

然后就能计算文档中的TF-IDF了,并且像上节内容中 IDF的预计算模式,也可以使用下面的 vectorizer._idf 来提取,用来给新的数据使用。

vectorizer = TfidfVectorizer()
tf_idf = vectorizer.fit_transform(docs)

q = "I get a coffee cup"
qtf_idf = vectorizer.transform([q])
res = cosine_similarity(tf_idf, qtf_idf)
res = res.ravel().argsort()[-3:]
print("\ntop 3 docs for '{}':\n{}".format(q, [docs[i] for i in res[::-1]]))

最后的TF-IDF矩阵结果是这样的。
在这里插入图片描述

领域搜索

类似迁移学习,如果你恰好要做一个领域的搜索,又恰好有这个领域的IDF分布,那么恭喜你,你省去了很多数据收集方面的烦恼。这就是IDF复用的神奇之处。

机器学习应用

我们也能用 TF-IDF 作为文档的训练数据,将文档向量化表示后,当做神经网络的输入,对这篇文档进行后续处理,比如分类,回归等拟合过程。

搜索全流程示意图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值