本文正在参与「金石方案 . 瓜分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]))
当然,咱们也能够将矩阵可视化,便于给读者愈加直观的感受:
别的,假如 IDFIDF 是所有文档的全局信息,那么带有不同特点的文档集群或许具有不同性质的 IDFIDF 散布。 比方在混合了金融领域的文档和一般文档的数据量中, 这会是个大而全的 IDFIDF,任意一个金融的词都或许对金融类查找很重要, 由于它能够将金融文档和其他类型的文档有用区分开。但是假如我数据库中只要金融的文档, 想要更精准的查找,这个大而全的 IDFIDF 就不适合了,那么我需求一个带有金融特点的 IDFIDF 表来优化对金融子领域的查找。 这也是 IDFIDF 比较重要的使用方法之一。
当然,一个完善的查找引擎不仅仅只要类似 TF−IDFTF-IDF 的算法,还有很多其他环节。从一个 query(查找问句)开始,包括了很多 query 预处理部分,比方分词,灵敏词过滤,纠错,拼音辨认,查询改写,查询补全等等。再通过各种的召回策略,比方 TF-IDF/ElasticSearch 召回,得到候选答案,最终再做一些业务层面的过滤处理,才干到达你的查找成果展示框里。所以看似一个小小的查找引擎,实际上要包括很多大的工程项目。
问题
用 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_)
得到 TF−IDFTF-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(代码篇)
我是,等待你的重视;
创作不易,请多多支撑;
系列专栏:AI NLP