type
status
date
summary
tags
icon
password
TFI IDF 算法原理
TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术,常用于挖掘文章中的关键词,而且算法简单高效,常被工业用于最开始的文本数据清洗。
TF-IDF有两层意思,一层是"词频"(Term Frequency,缩写为TF),另一层是"逆文档频率"(Inverse Document Frequency,缩写为IDF)。
词频高在文章中往往是停用词,“的”,“是”,“了”等,这些在文档中最常见但对结果毫无帮助、需要过滤掉的词,用TF可以统计到这些停用词并把它们过滤。当高频词过滤后就只需考虑剩下的有实际意义的词。
TF-IDF 算法步骤
- 计算词频

- 计算逆文档频率:
这时,需要一个语料库(corpus),用来模拟语言的使用环境。
如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数。

可以看到,TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语言中的出现次数成反比。所以,自动提取关键词的算法就很清楚了,就是计算出文档的每个词的TF-IDF值,然后按降序排列,取排在最前面的几个词。
TF-IDF是用来做文本分类的,这个值越大,用来做分类的价值就越高,而不是在这个文本中的重要性越高。
这里是在实现词的选择,目标用哪些词来表征文档能最大化地保留文档的完整信息,特征抽取出来只是用来表征文档,理论上可以用于任何下游任务。
即: 抽取特征
Embeddings 技术
OpenAI 的文本嵌入衡量文本字符串的相关性。嵌入通常用于:
- 搜索
(结果按与查询字符串的相关性排名)
- 聚类
(文本字符串按相似性分组)
- 推荐
(推荐具有相关文本字符串的项目)
- 异常检测
(识别出相关性很小的异常值)
- 多样性测量
(分析相似性分布)
- 分类
(文本字符串按最相似的标签进行分类)
嵌入是浮点数的向量(列表)。两个向量之间的距离衡量它们的相关性。距离小表明相关性高,距离大表明相关性低。
为了快速搜索许多向量,我们建议使用向量数据库。您可以在 GitHub 上的 Cookbook 中找到使用矢量数据库和 OpenAI API 的示例。
矢量数据库选项包括:
矢量数据库选项包括:
- Pinecone
,一个完全托管的矢量数据库
- Weaviate
,一个开源矢量搜索引擎
- Redis
作为向量数据库
- Qdrant
,矢量搜索引擎
- Milvus
,一个为可扩展的相似性搜索而构建的矢量数据库
- Chroma
,一个开源嵌入商店
- Typesense
,快速开源矢量搜索
- Zilliz
,数据基础设施,由 Milvus 提供支持
向量距离函数
我们推荐余弦相似度。距离函数的选择通常并不重要。
OpenAI 嵌入标准化为长度 1,这意味着:
- 仅使用点积即可稍微更快地计算余弦相似度
- 余弦相似度和欧氏距离将导致相同的排名
数值接近1,则两个向量越贴近
余弦相似度计算
- 余弦相似性:余弦相似性衡量的是两个向量之间的夹角的余弦值。它的取值范围是[-1, 1],值越接近1,表示向量越相似;值越接近-1,表示向量越不相似。余弦相似性计算公式如下:
cos_sim(A, B) = dot_product(A, B) / (norm(A) * norm(B))
其中,dot_product(A, B)表示向量A和向量B的点积,norm(A)表示向量A的模长。
- 欧几里得距离:欧几里得距离衡量的是两个向量在空间中的直线距离。数值越小,表示两个向量越相似。欧几里得距离计算公式如下:
euclidean_distance(A, B) = sqrt(sum((A_i - B_i)^2 for i in range(len(A))))
其中,A_i和B_i分别表示向量A和向量B的第i个分量。
通过计算文本向量之间的相似性得分,我们可以确定哪些文本在语义上更相似。这种方法可以用于许多自然语言处理任务,如文本聚类、文档检索和推荐系统等。
实现K近邻算法的过程。

在数学几何运算中,余弦定理用于计算两条边的夹角,余弦值越大,夹角越小。当夹角为0°时,两条边(x,y)完全重合
而对于多维图像(x,y,z...)三(甚至n)条边,计算公式如下:




两个向量越相似,夹角越小,计算出来的余弦值越接近1
- 文本切词
- 文本1:明天\不\下雨
- 文本2:明天\不\可能\下雨
- 文本词频统计
- 文本1词频:(明天=>1, 不=>1, 下雨=>1, 可能=>0)
- 文本2词频:(明天=>1, 不=>1, 下雨=>1, 可能=>1)
- 文本词向量
- 文本1词向量:(1,1,1,0)
- 文本2词向量:(1,1,1,1)
- word2Vec
- TF-IDF
- 将本地答案数据集,转为向量存储到向量数据
- 当用户输入查询的问题时,把问题转为向量然后从向量数据库中查询相近的答案topK 这个时候其实就是我们最普遍的问答查询方案,在没有GPT的时候就直接返回相关的答案整个流程就结束了
- 现在有GPT了可以优化回答内容的整体结构,在单纯的搜索场景下其实这个优化没什么意义。但如果在客服等的聊天场景下,引用相关领域内容回复时,这样就会显得不那么的突兀。
- es8
- vearch
- milvus
- TFIDF:基于词频的越高值越大,如果某个词或短语在某个文档中出现的频率较高则对词频较低的文档能很好区分出来,适合分类。
- bm25:一种用来评价搜索词和文档之间相关性的算法,它是一种基于概率检索模型提出的算法
相关分词算法
Word2vec采用了开源词库,文本利用hanlp分词后,获取Word-Embeddings,将所有Word-Embedding取均值后得到文本的Embedding,对于不存在词,则随机(引入均值和方差)生成Word-Embedding。由于告警信息的不存在词比例较高,对不存在词降低35%的权重。
TF-IDF,获取文本词频向量作为Embedding
Word2vec需要额外的数据库空间和分词工具,TF-IDF无任何需要。
TF-IDF难以使用向量数据库,无法大规模使用.
对词向量算法的应用:
搭建私有化知识库

实现流程原理
1、建立向量数据库的collection(相当于数据库表)
2、创建collection的索引
4、导入数据调用openAi转换为向量浮点数据,把数据文本和向量浮点数据存入到collection中
5、加载collection到内存中,用于查询
6、用户查询调用openAi转换为向量浮点数据,根据向量浮点数据查询向量数据库得到数据文本
7、把用户的问题和从向量数据库的数据文本,编写一个prompt,交给GPT进行润色,并生成答案。
主要就以下几个点:
以上是把文本丢给chat GPT 去做, 涉及到内容安全问题, 可以把 chatGpt 替换成 word2Vec 模块, 流程如下:

向量数据库介绍
向量数据库是一种特殊类型的数据库,用于基于相似性组织数据。为此,它们将原始数据(如图像、文本、视频或音频)转换为数学表示,称为多维向量。每个向量可以具有从几十到几千个维度,具体取决于原始数据的复杂性。
常见向量数据库
搜索算法
对于搜索结果最关键的是打分,打分越高说明对搜索结果越匹配。
TF-IDF是传统的统计方法。TF(Term Frequency)是词频的意思,IDF(Inverse Document Frequency)是逆文档频率。TF-IDF的值越大说明这个关键词对这个文档重要性越高。注意这里需要去掉无用的词,这里对文档的上下文是没有关联的
BM25算法:
向量数据库需要解决什么问题?因为向量数据库是基于embedding之后的向量的存储与检索。所以首先需要提供存储能力,其次更重要的是检索。 即如何根据一个query快速找到相关的embedding内容。 关于检索,主要是计算两个向量之间的相似度。
什么是嵌入?
任何非结构化数据(图像/文本/音频/视频)都可以通过人工智能(法学硕士或其他深度神经网络)转换为计算机通常可以理解的向量。
[0.23, 1.98, ....]
例如,“The man is happy”——这句话可以通过 SentenceTransformer 语言模型转换为 384 维向量(数字列表)。这个过程称为嵌入。生成 embed 工具
awadb
awa-ai • Updated Aug 30, 2023
- 作者:林东
- 链接:https://tangly1024.com/article/cd4be4ee-1cd3-4093-a29c-b3f516130b66
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。