本文正在参与「金石方案 . 瓜分6万现金大奖」

前语

在上篇博文 【NLP】入门(四):TF-IDF(代码篇) 结尾处,博主曾留下疑问:除了查找匹配之外,TF-IDF 还能干些什么有意思的工作呢?

不知道咱们考虑的如何,接下来且听博主分析;

拓展

TF−IDFTF-IDF 其实便是一种将 词语重要程度 转换成 向量 的文档展示方法,那么在这些向量中, 必定会有主导型元素,而这些元素其实便是这篇文档中很重要的关键词了。

下面的功用便是给前三篇文档挑两个关键词:

def get_keywords(n=2):
    for c in range(3):
        # 选取第 c 篇文章的 tf_idf 值
        col = tf_idf[:, c]
        # 回来 tf_idf 值最大的前 n 个索引
        idx = np.argsort(col)[-n:]
        print("doc{}, top{} keywords {}".format(c, n, [i2v[i] for i in idx]))

【NLP】入门(五):TF-IDF(拓展篇)

当然,咱们也能够将矩阵可视化,便于给读者愈加直观的感受:

【NLP】入门(五):TF-IDF(拓展篇)

别的,假如 IDFIDF 是所有文档的全局信息,那么带有不同特点的文档集群或许具有不同性质的 IDFIDF 散布。 比方在混合了金融领域的文档和一般文档的数据量中, 这会是个大而全的 IDFIDF,任意一个金融的词都或许对金融类查找很重要, 由于它能够将金融文档和其他类型的文档有用区分开。但是假如我数据库中只要金融的文档, 想要更精准的查找,这个大而全的 IDFIDF 就不适合了,那么我需求一个带有金融特点的 IDFIDF 表来优化对金融子领域的查找。 这也是 IDFIDF 比较重要的使用方法之一。

当然,一个完善的查找引擎不仅仅只要类似 TF−IDFTF-IDF 的算法,还有很多其他环节。从一个 query(查找问句)开始,包括了很多 query 预处理部分,比方分词,灵敏词过滤,纠错,拼音辨认,查询改写,查询补全等等。再通过各种的召回策略,比方 TF-IDF/ElasticSearch 召回,得到候选答案,最终再做一些业务层面的过滤处理,才干到达你的查找成果展示框里。所以看似一个小小的查找引擎,实际上要包括很多大的工程项目。

【NLP】入门(五):TF-IDF(拓展篇)

问题

TF−IDFTF-IDF 来表明文档,然后能够用来做查找和提取关键词。 但是在代码中存在一个机制,会引发 内存占用大 的问题。

TF−IDFTF-IDF 是一张二维表,分别代表文章索引和单词索引。文章量是能够无限增大的,单词量的增加也是很恐惧的。那么跟着这两个维度的增加, 咱们的内存总有一天会扛不住。好在咱们能够使用一个节省内存的技能,叫做 Sparse Matrix,稀疏矩阵,它只会存储有内容的值,而忽略无内容的值。 在这张巨大的二维表中,肯定每篇文章纷歧定会提及到所有词汇,这些不提及的词汇,咱们当然能够不用存储

Skearn 模块的 Sparse Matrix 功用,能更快速,有用地计算和存储海量的数据。

导入 sklearn 包:

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

然后就能计算文档中的 TF−IDFTF-IDF 了,像上篇博文 【NLP】入门(四):TF-IDF(代码篇) 中 IDF 计算一样,也能够使用下面的vectorizer._idf来提取,用来给新的数据使用。

vectorizer = TfidfVectorizer()
tf_idf = vectorizer.fit_transform(docs)
print("idf: ", [(n, idf) for idf, n in zip(vectorizer.idf_, vectorizer.get_feature_names())])
print("v2i: ", vectorizer.vocabulary_)

【NLP】入门(五):TF-IDF(拓展篇)

得到 TF−IDFTF-IDF 矩阵成果:

【NLP】入门(五):TF-IDF(拓展篇)

这时,咱们就能够使用 TF−IDFTF-IDF 进行查找匹配了:

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]]))

【NLP】入门(五):TF-IDF(拓展篇)

后记

以上便是【NLP】入门(五):TF-IDF(拓展篇)的全部内容了。

希望本篇博文对咱们有所协助!

上篇精讲:【NLP】入门(四):TF-IDF(代码篇)

我是,等待你的重视;

创作不易,请多多支撑;

系列专栏:AI NLP