文本分析 ※TF-IDF提取关键词及cosine相似度计算

①统计 按需词频 (根据业务需求不同,统计条件不同)
具体情况:
文本单一词 在不同类型文本 出现次数和
-“我爱你 我爱你 我爱你” “我爱你”算一次
-“我爱你 我爱你 我爱你” “我爱你”算三次

文本单一词 出现总次数:
-“我爱你 我爱你 我爱你” 这句话出现40次 “我爱你”算(1*40)次
-“我爱你 我爱你 我爱你” 这句话出现40次 “我爱你”算(3*40)次

# 构建 统计字典     dict为在不同类型文本 出现次数和    dict2为出现总次数
dict={}
dict2={}
#遍历处理每一条数据
for i in range(len(data)):
    str=data.loc[i, "question"]                       #获取该条数据对应的文本
    num=int(data.loc[i,"question_count"])             #获取该文本出现次数
    lis=jieba.cut(str)                        #分词
    word = []
    for ii in lis:
        #算一次还是算三次的条件。算三次则无需加该判断
        if ii not in word:            
            word.append(ii)              
    for i in range(len(word)):
        if dict.get(word[i]):
            dict[word[i]]+=1
        else:
            dict[word[i]]=1
        if dict2.get(word[i]):
            dict2[word[i]]+=num
        else:
            dict2[word[i]]=num
#按照出现频次从大到小排列
d1 = zip(dict.values(), dict.keys())
print(sorted(d, reverse=True))
d2 = zip(dict2.values(), dict2.keys())
print(sorted(d2, reverse=True))

②TF-IDF(Term Frequency-Inverse Document Frequency)提取关键词。
TF-IDF模型中
TF为词频 IDF为逆文档频率 计算公式:
在这里插入图片描述在这里插入图片描述

#引入包
import numpy as np
import pandas as pd
#定义数据和预处理    如果是中文句子则进行jieba分词 ③部分有
docA= "The cat sat on my bed"
docB= "The dog sat on my knees"
#词袋
bowA = docA.split(" ")  
bowB = docB.split(" ")  
wordSet = set(bowA).union(set(bowB))     #构建词库,统计

#进行次数统计,统计字典保存词出现的次数
wordDictA = dict.fromkeys(wordSet, 0)
for word in bowA:
    wordDictA[word] += 1
wordDictB = dict.fromkeys(wordSet, 0)
for word in bowB:
    wordDictB[word] += 1
pd.DataFrame([wordDictA,worldDictB])

#计算词频TF   传入参数:(统计好的字典,词袋)
def computeTF (wordDict, bow):
    tfDict = {}
    nbowCount =len(bow)
    for word,count in wordDict.items():
        tfDict[word] = count / nbowCount
    return tfDict

#计算逆文档频率
def computeIDF(wordDictList):
    idfDict = dict.fromkeys(wordDictList[0], 0)
    N = len(wordDictList)
    import math
    for wordDict in wordDictList:
        #遍历字典中的每个词汇,统计Ni
        for word,count in worldDict.items():
            if count>0:
                idfDict[word] +=1
    for word, ni in idfDict.items():
        idfDict[word] = math.log10((N+1)/(ni+1))
    return idfDict
    
#计算TF-IDF
def computeTFIDF(tf, idf):
    tfidf={}
    for word,value in tf.items():
        tfidf[word]=value*idf[word]
    return tfidf

使用:
tfA=computeTF(wordDictA, bowA)                 #A的词频
idfs=computeIDF([wordDictA, wordDictB])        #逆文档频率
print(computeTFIDF(tfA, idfs))                 #A的TFIDF列表

③cosine相似度判断函数:

import jieba    依赖包 可以切分中文关键词
#a, b为需要判断的两个字符串
def sim_compute(a, b):
    str1=jieba.cut(a)
    str2=jieba.cut(b)
    #分别将结果转存为两个列表
    word1=[]
    word2=[]
    for i in str1:
        word1.append(i)
    for i in str2:
        word2.append(i)
    #合并word1与word2  
    word = set(word1)
    for value in word2:
        word.add(value)
    #初始化两个单词的向量并统计出现次数
    word1_vec={}
    for value in word:
        word1_vec[value]=0
    for value in word1:
        if word1_vec.get(value):
            word1_vec[value]+=1
        else:
            word1_vec[value]=1
    word2_vec={}
    for value in word:
        word2_vec[value]=0
    for value in word2:
        if word2_vec.get(value):
            word2_vec[value]+=1
        else:
            word2_vec[value]=1
    #统计结果转化为向量
    vec_1=[]
    vec_2=[]
    for i in word:
        vec_1.append(word1_vec[i])
        vec_2.append(word2_vec[i])
    #公式计算cosine相似度
    sum = 0
    sq1 = 0
    sq2 = 0
    for i in range(len(vec_1)):
        sum += vec_1[i] * vec_2[i]
        sq1 += pow(vec_1[i], 2)
        sq2 += pow(vec_2[i], 2)
    try:
        result = round(float(sum) / (math.sqrt(sq1) * math.sqrt(sq2)), 2)
    except ZeroDivisionError:
        result = 0.0
    return result
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章