python数据分析-文本相似度分析

由于本文设计较多知识点,在编写代码之前需要搞清楚这些知识点的含义。

1。知识点解释

  • Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法,支持流式训练,并提供了诸如相似度计算,信息检索等一些常用任务的API接口。
    gensim 以“文集”——文本文档的集合——作为输入,并生成一个“向量”来表征该文集的文本内容,从而实现语义挖掘。
  • TF-IDF.对于提取一篇文章的关键词,如果某个词很重要,它应该在这篇文章中多次出现。于是,我们进行”词频”(Term Frequency,缩写为TF)统计。现次数最多的词是—-“的”、”是”、”在”—-这一类最常用的词。它们叫做”停用词”(stop words),表示对找到结果毫无帮助、必须过滤掉的词。而对于我们需要的关键词,例如对于上篇博文中的《丰乳肥臀》,出现最多的前十个词中包括如:上官,女人,一个,地说,母亲。显然对于关键词:一个,地说,对反应文章的特性并没有其余几个好,这时,就是在词频的基础上,要对每个词分配一个”重要性”权重。最常见的词(”的”、”是”、”在”)给予最小的权重,较常见的词(”一个”)给予较小的权重,较少见的词(”上官”、”女人”)给予较大的权重。这个权重叫做”逆文档频率”(Inverse Document Frequency,缩写为IDF),它的大小与一个词的常见程度成反比。知道了”词频”(TF)和”逆文档频率”(IDF)以后,将这两个值相乘,就得到了一个词的TF-IDF值。某个词对文章的重要性越高,它的TF-IDF值就越大。这里写图片描述这里写图片描述+1为了防止分母出现0。了解了TF-IDF之后,又出现了新的词:语料库。参考一
  • 语料库(corpus)。理论上语料越大越好 ,百度百科的解释:⒈语料库中存放的是在语言的实际使用中真实出现过的语言材料,因此例句库通常不应算作语料库;⒉语料库是承载语言知识的基础资源,但并不等于语言知识;⒊真实语料需要经过加工(分析和处理),才能成为有用的资源。
  • 余弦相似性。简单的说,对于要要计算相似度的两个句子,步骤:分词-计算词频-将词频写成向量形式-计算向量相似程度(向量夹角)。这里写图片描述
    计算方式如下:
    这里写图片描述
    这里写图片描述
    假定a向量是[x1, y1],b向量是[x2, y2],那么可以将余弦定理改写成下面的形式。
    这里写图片描述
    余弦的这种计算方法对n维向量也成立。假定A和B是两个n维向量,A是 [A1, A2, …, An] ,B是 [B1, B2, …, Bn] ,则A与B的夹角θ的余弦等于:
    这里写图片描述
    余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫”余弦相似性”。

    参考

    所以,对于要计算的两篇文章的相似度:
    (1)使用TF-IDF算法,找出两篇文章的关键词;
    (2)每篇文章各取出若干个关键词(比如20个),合并成一个集合,计算每篇文章对于这个集合中的词的词频(为了避免文章长度的差异,可以使用相对词频);
    (3)生成两篇文章各自的词频向量;
    (4)计算两个向量的余弦相似度,值越大就表示越相似。

2。代码

#!/user/bin/env python
#-*- coding:utf-8 -*-
#author:M10
import jieba
from gensim import corpora,models,similarities
from collections import defaultdict
doc1 = '/Users/wangxingfan/Desktop/doc1.txt'
doc2 = '/Users/wangxingfan/Desktop/doc2.txt'
d1 = open(doc1).read()
d2 = open(doc2).read()
data1 = jieba.cut(d1)
data2 = jieba.cut(d2)
list1 = []
list2 = []
list = []
for i in data1:
    list1.append(i)
for i in data2:
    list2.append(i)
list = [list1,list2]
frequency = defaultdict(int)#如果键不存在则返回N/A,而不是报错,获取分词后词的个数
for i in list:
    for j in i:
        frequency[j] +=1
#创建词典
dictionary = corpora.Dictionary(list)
#词典保存到本地
dictionary.save('/Users/wangxingfan/Desktop/dic1.txt')
doc3 = '/Users/wangxingfan/Desktop/doc3.txt'
d3 = open(doc3).read()
data3 = jieba.cut(d3)
data31 = []
for i in data3:
    data31.append(i)
new_doc = data31
#稀疏向量.dictionary.doc2bow(doc)是把文档doc变成一个稀疏向量,[(0, 1), (1, 1)],表明id为0,1的词汇出现了1次,至于其他词汇,没有出现。
new_vec = dictionary.doc2bow(new_doc)
#获取语料库
corpus = [dictionary.doc2bow(i) for i in list]
tfidf = models.TfidfModel(corpus)
#特征数
featureNUM = len(dictionary.token2id.keys())
#通过TfIdf对整个语料库进行转换并将其编入索引,以准备相似性查询
index = similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=featureNUM)
#计算向量相似度
sim = index[tfidf[new_vec]]
print(sim)

输出结果[ 0. 0.7104941]
参考:
gensim教程
gensim:相似性查询
如何计算两个文档的相似度(二)

  • 4
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 文本相似度分析是比较两个文本之间的相似程度,Python可以通过多种方式实现这一操作。以下是一个简单的示例。 首先,我们需要使用一个文本分析库,例如NLTK或spaCy。这些库提供了许多文本处理工具和算法。 其次,我们需要加载要比较的两个文本。可以从文件中读取文本,或者直接将文本字符串保存在变量中。 接下来,我们需要对文本进行预处理。这包括去除停用词(例如“a”、“is”、“the”等)、标点符号和特殊字符,以及将文本转换为小写。 然后,我们可以使用一种或多种相似度算法来比较两个文本之间的相似程度。常见的算法包括余弦相似度、Jaccard相似度和编辑距离。这些算法的实现通常可以在文本分析库中找到。 最后,我们可以将相似度得分输出为一个介于0和1之间的值。接近1的得分表示文本相似,接近0的得分表示文本越不相似。 下面是一个示例代码: ```python import nltk from nltk.corpus import stopwords from nltk.tokenize import word_tokenize from nltk.stem import WordNetLemmatizer from nltk.metrics.distance import edit_distance from sklearn.feature_extraction.text import TfidfVectorizer # 加载停用词 stop_words = set(stopwords.words("english")) # 加载文本 text1 = "This is a sample sentence." text2 = "This is another example sentence." # 预处理文本 lemmatizer = WordNetLemmatizer() tokens1 = [lemmatizer.lemmatize(word.lower()) for word in word_tokenize(text1) if word.isalpha() and word.lower() not in stop_words] tokens2 = [lemmatizer.lemmatize(word.lower()) for word in word_tokenize(text2) if word.isalpha() and word.lower() not in stop_words] # 计算文本相似度(余弦相似度) vectorizer = TfidfVectorizer() tfidf_matrix = vectorizer.fit_transform([text1, text2]) similarity_score = (tfidf_matrix * tfidf_matrix.T).A[0, 1] # 计算文本相似度(编辑距离) edit_distance_score = edit_distance("".join(tokens1), "".join(tokens2)) print("余弦相似度:", similarity_score) print("编辑距离:", edit_distance_score) ``` 通过以上步骤,我们可以得到两个文本之间的相似度得分。这个示例只涵盖了最基本的文本相似度分析方法,实际上还有许多其他复杂的技术和算法可以用于更精确的分析。 ### 回答2: 文本相似度分析是指通过计算两个文本之间的相似度来衡量它们之间的相似程度。Python提供了多种库和算法可以实现这个操作,下面我会详细介绍一种常用的方法。 一、文本预处理: 在进行文本相似度分析之前,首先需要对文本进行预处理。常见的预处理方法包括去除停用词、转换为词向量表示、将文本转换为TF-IDF向量等。 二、计算文本相似度: 一种常用的计算文本相似度的方法是通过计算两个文本的余弦相似度来衡量它们之间的相似程度。步骤如下: 1. 将两个文本转换为词向量表示,可以使用词袋模型或TF-IDF向量表示。 2. 计算两个向量的余弦相似度。余弦相似度值越接近于1,表示两个向量越相似;值越接近于0,表示两个向量越不相似。 三、代码示例: 下面是一个简单的示例代码,用于计算两个文本之间的相似度。 ```python import numpy as np from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity # 定义两个文本 text1 = "Python是一种简单易学的编程语言" text2 = "Python是一种功能强大的编程语言" # 创建词袋模型 vectorizer = CountVectorizer().fit_transform([text1, text2]) # 计算余弦相似度 similarity = cosine_similarity(vectorizer[0], vectorizer[1]) print("文本相似度:", similarity[0][0]) ``` 以上代码中,我们使用了CountVectorizer来创建词袋模型,并计算了两个文本之间的余弦相似度。 通过上述步骤,我们就可以使用Python实现简单的文本相似度分析操作了。当然,还有其他更复杂的方法和算法可以用于文本相似度分析,如基于词向量的方法(如Word2Vec、GloVe)和基于深度学习的方法(如BERT、ELMo),可以根据具体需求选择合适的方法进行分析。 ### 回答3: 文本相似度分析是通过比较文本之间的相似性来确定它们之间的相关性。Python提供了强大的工具和库来实现这样的操作。 首先,我们需要使用自然语言处理工具对文本进行预处理,例如去除标点符号、停用词和数字等。常用的预处理库包括NLTK和spaCy。 在预处理完成后,我们可以使用不同的文本相似度度量方法来比较文本之间的相似度。其中常见的方法包括余弦相似度、欧几里得距离和Jaccard相似度等。 对于余弦相似度,我们可以使用Python中的scikit-learn库来计算。首先,我们需要将文本转换为向量表示,常用的方法是使用词袋模型或TF-IDF模型。然后,我们可以使用cosine_similarity函数来计算两个向量之间的余弦相似度。 对于欧几里得距离和Jaccard相似度,我们可以使用Python中的scipy库来计算。欧几里得距离可以使用euclidean函数,而Jaccard相似度可以使用jaccard_similarity函数来计算。 除了以上方法,还可以使用更高级的文本相似度计算方法,例如Word2Vec或BERT模型。这些模型基于神经网络,能够更好地捕捉文本之间的语义关系。 综上所述,Python提供了丰富的库和工具来实现简单的文本相似度分析操作。我们只需要进行预处理,选择适当的相似度度量方法,并使用相应的库函数来计算即可。这些操作可以帮助我们在信息检索、推荐系统和文本分类等领域中处理和分析大量的文本数据。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值