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