利用tf-idf计算文本相似度

关于使用tf-idf进行文本相似度的计算,个人觉得这两篇文章讲解的很好:https://blog.csdn.net/Jorocco/article/details/82223675https://blog.csdn.net/pcy1127918/article/details/79955949?utm_source=blogxgwz2,大家可以去看一看。我在这里说一些自己在学习文本相似度的计算的过程中的一些感悟,以及一些自己的理解。如有不当之处,请予指正。

  1. 首先应该明确,文本相似度计算就是将两个个体的特征向量化,然后通过余弦公式计算两者之间的相似性即可(当然除了使用余弦相似度的方法,也可以用欧拉距离或者jaccard系数的方法来计算文本相似度,具体方法此处不再赘述),因此问题的关键就是去将两个个体的特征向量化。
  2. 对于文本相似度的计算,简单来说就是以下几个步骤:A.找出各自文章的关键词并合成一个词集合   B.求出两个词集合的并集(词包)   C.计算各自词集的词频并把词频向量化    D.带入向量计算模型就可以求出文本相似度
  3. 词频TF,词频是一个词语在文章或句子中出现的次数。如果一个词很重要,很明显是应该在一个文章中出现很多次的,但是这也不是绝对的,比如“地”,“的”,“啊”等词,它们出现的次数对一篇文章的中心思想没有一点帮助,只是中文语法结构的一部分而已。这类词也被称为“停用词”。所以,在计算一篇文章的词频时,停用词是应该过滤掉的。如果某个词比较少见(在我们准备的文章库中的占比比较少),但是它在这篇文章中多次出现,那么它很可能反映了这篇文章的特性,正是我们所需要的关键词。在此,在词频TF的基础上又引出了反文档频率IDF的概念。一般来说,在一篇文章或一个句子来说,对于每个词都有不同的重要性,这也就是词的权重。在词频的基础上,赋予每一个词的权重,进一步体现该词的重要性。比如一篇报道中国农业养殖的新闻报道。最常见的词(“的”、“是”、“在”)给予最小的权重,较常见的词(“国内”、“中国”、“报道”)给予较小的权重,较少见的词(“养殖”、“维基”)。所以刻画能力强的词语,权重应该是最高的。TFIDF进行相乘,就得到了一个词的TF-IDF值,某个词对文章重要性越高,该值越大,于是排在前面的几个词,就是这篇文章的关键词。(在实际中,还要考虑词的词性等多维度的特性,动词,名词,形容词的刻画能力也是有所差别的;因社会热点而词的刻画性爆发式提高(比如打call))。因此,我们需要用一个词的TF-IDF值来代替词频,然后再将其向量化,这就是tf-idf模型发挥作用的地方。
  4. 另外需要注意,dictionary.doc2bow方法是把文档变成一个稀疏向量。稀疏向量既可以用Id+频数,也可以用indicesvalues表示。文本相似度的计算中,稀疏向量是用(id,频数)这种形式表示的。

 

namespace ServiceRanking { /// <summary> /// Summary description for TF_IDFLib. /// </summary> public class TFIDFMeasure { private string[] _docs; private string[][] _ngramDoc; private int _numDocs=0; private int _numTerms=0; private ArrayList _terms; private int[][] _termFreq; private float[][] _termWeight; private int[] _maxTermFreq; private int[] _docFreq; public class TermVector { public static float ComputeCosineSimilarity(float[] vector1, float[] vector2) { if (vector1.Length != vector2.Length) throw new Exception("DIFER LENGTH"); float denom=(VectorLength(vector1) * VectorLength(vector2)); if (denom == 0F) return 0F; else return (InnerProduct(vector1, vector2) / denom); } public static float InnerProduct(float[] vector1, float[] vector2) { if (vector1.Length != vector2.Length) throw new Exception("DIFFER LENGTH ARE NOT ALLOWED"); float result=0F; for (int i=0; i < vector1.Length; i++) result += vector1[i] * vector2[i]; return result; } public static float VectorLength(float[] vector) { float sum=0.0F; for (int i=0; i < vector.Length; i++) sum=sum + (vector[i] * vector[i]); return (float)Math.Sqrt(sum); } } private IDictionary _wordsIndex=new Hashtable() ; public TFIDFMeasure(string[] documents) { _docs=documents; _numDocs=documents.Length ; MyInit(); } private void GeneratNgramText() { } private ArrayList GenerateTerms(string[] docs) { ArrayList uniques=new ArrayList() ; _ngramDoc=new string[_numDocs][] ; for (int i=0; i < docs.Length ; i++) { Tokeniser tokenizer=new Tokeniser() ; string[] words=tokenizer.Partition(docs[i]); for (int j=0; j < words.Length ; j++) if (!uniques.Contains(words[j]) ) uniques.Add(words[j]) ; } return uniques; } private static object
### 回答1: TF-IDF结合余弦相似度是一种常用的文本相似度分析方法。TF-IDF是一种用于评估一个词语在文档中的重要程度的统计方法,它考虑了一个词语在文档中出现的频率以及在整个语料库中出现的频率。余弦相似度是一种用于计算两个向量之间的相似度的方法,它可以用于计算文本之间的相似度。将TF-IDF和余弦相似度结合起来,可以计算两个文本之间的相似度,从而实现文本相似度分析。 ### 回答2: TF-IDF(term frequency-inverse document frequency)是一种常用的文本特征提取方法,被广泛用于文本数据挖掘和信息检索中。它的基本思想是将每个词汇在文本中的重要性权值化,从而实现文本相似度分析。 在TF-IDF中,文本中某个词汇的重要性被定义为该词汇在所有文档中出现的频率(即词频)与该词汇在当前文档中出现的频率的乘积的对数。TF-IDF计算方式可以分为两个步骤:第一步是计算词频TF(term frequency),即某个词汇在当前文档中出现的次数除以该文档中所有词汇的总数。第二步是计算逆文档频率IDF(inverse document frequency),即所有文档数目除以包含该词汇的文档数的对数。最终的TF-IDF权值为TF和IDF的乘积。 余弦相似度是一种常用的衡量两个文本相似度的方法,其基本思想是将文本向量映射到一个n维空间中,然后计算两个文本向量在该空间中的夹角余弦值。余弦值越大,表示两个文本相似度越高。 把TF-IDF结合余弦相似度来做相似度分析,具体步骤如下: 1. 对于每个文本利用TF-IDF方法计算每个词汇的权值。 2. 把文本中所有词汇的权值按照其在字典中的顺序排列,构成一个向量。 3. 对于两个文本,分别计算它们的TF-IDF向量。 4. 计算两个向量之间的夹角余弦值,它的值越接近1,表示两个向量越相似。 5. 如果需要对多个文本进行相似度分析,可以计算每个文本与其他文本相似度,然后根据相似度值进行排名。 TF-IDF结合余弦相似度相似度分析具有以下优点: 1. 通过对每个词汇的权值进行计算,可以准确地反映它在文本中的重要性。 2. 余弦相似度可以在一个高维向量空间中进行,可以避免维数灾难的问题。 3. 多个文本可以进行快速的比较和排序。 4. 可以应用于各种文本数据挖掘和信息检索任务,如推荐系统、文本分类和信息抽取等。 综上所述,TF-IDF结合余弦相似度是一种非常有效的文本相似度分析方法,可以广泛应用于各种文本数据挖掘和信息检索任务中。 ### 回答3: tf-idf结合余弦相似度是一种常用的文本相似度分析方法。它可以用于比较不同文本之间的相似性,以便确定它们是否具有相同的主题或意义。 tf-idf是一种文本特征提取技术,可以计算出某个词在文本中的重要程度。具体来说,tf-idf通过计算某个词在文本中的频率(tf)和在文集中的逆文档频率(idf)来确定其重要程度。逆文档频率表示某个词在文集中的普及程度,计算公式为:$idf(t)=log\frac{N}{df_t}$,其中N表示文集中文档的总数,$df_t$表示出现词t的文档数。 余弦相似度是一种衡量两个向量之间夹角的度量方法。在文本相似度分析中,可以将文本看作是向量,其中每个维度表示一个词的重要程度。通过计算两个文本向量的余弦相似度,可以得到它们之间的相似度。 将tf-idf和余弦相似度结合起来,可以实现文本相似度分析。具体来说,可以先将每个文本转换成一个向量,根据tf-idf计算出每个向量中每个词的重要程度,并根据余弦相似度计算两个向量之间的相似度。通过比较所有文本之间的相似度,可以找到相似度较高的文本,进而确定它们之间是否具有相同的主题或意义。 总之,tf-idf结合余弦相似度是一种有效的文本相似度分析方法,可以帮助我们快速准确地比较不同文本之间的相似性。在信息检索、推荐系统、自然语言处理等领域都有广泛的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值