赞
踩
这个小项目是跟一位广工的小伙伴一起完成的,他负责提供数据和这个模型的理论,没办法,谁让咱数学底子薄呢,我就是负责一下代码实现就完事了
模型理论
这个模型的基础理论其实不难
假设我有一千篇论文,通过数据清洗,分词等操作,我得到了关键词数据。
然后从这些关键词中,再次去找关键词。常理来说,一个词出现的频率越高那么这个词就越关键。然如果只有这一篇论文出现了这么一个词,而且满篇都是这一个词,这个词被恶意刷屏了,怎么办。那么我们就在引入一个量,log(总文章/总文章中含有这个词的文章数),咱也不晓得这个模型的大佬是怎么想的用这个方法,可能这就是奇才吧。然后我们把这个词频和那个数相乘,那么就得到了我们需要的量 TF-IDF模型量,通过这个量,我们得知哪个关键字最关键。
代码实验
来来来,直接代码搞一波
首先做个声明,所有的数据已经清洗,分词完毕,统一放在一个txt文件中,那么有人问了,都放在了同一个文件中,那怎么算后面那个量呢。很简单,我们可以把获取的这个大数组分成若干个小数组,模拟有这么多篇论文,因为是实验,总有些不严谨的地方。
```python from collections import Counter import math import operator """ 读取txt函数 path:txt路径 encod:编码 """ def read_txt(path,encod): file = open(path, 'r',encoding = encod) return file """ 将已经分好词的文本文件转换成数组 """ def txtToList(file): list = [] num = 0 contents = file.readlines() for content in contents: content = content.split(',') for word in content: list.append(word) num = num + 1 print("当前文本词汇个数: ",num) return list,num """ 将list数据存入txt文件中 """ def listToTxt(put_list,fileName): f = open(fileName, "w",encoding="utf-8") for list_mem in put_list: f.write(list_mem + ",") f.close() """ 将数组按照等量划分 """ def arr_size(arr,size): s=[] for i in range(0,len(arr)+1,size): c=arr[i:i+size] s.append(c) return s # 计算词频 def func_counter(word_list): count_result = Counter(word_list) return count_result # 寻找某个关键词的词数 def fidc_wf(word,wfs_Dict): word_num = wfs_Dict[word] return word_num #关键词在这篇文章中是否出现 def findw_article(word,article): for str in article: if( word == str): return True return False # 查出包含该词的文档数 def wordinfilecount(i_word, put_lists): count = 0 # 计数器 for train_list in put_lists: if (findw_article(i_word, train_list)): count = count + 1 #print("关键字在" + str(count) + "篇q文章中出现过") return count # 计算TF-IDF,并返回字典 def tf_idf(dataList,putLists,num): tf = 0 idf = 0 dic = func_counter(dataList) #获取每个关键词的出现次数 outdic = dic for word in dic.keys(): tf = fidc_wf(word,dic)/num #计算关键词词频 idf = math.log(len(putLists)/(wordinfilecount(word,putLists)+1)) #计算idf tfidf = tf * idf # 计算综合 outdic[word] = tfidf #写入键值对 orderdic = sorted(outdic.items(), key=operator.itemgetter(1), reverse=True) # 给字典排序 return orderdic # 读取文件 file = read_txt(自己的文件路径,'utf-8') # 将文件转化为list数组 list,num = txtToList(file) # 将数组按照1000的个数划分成若干个小数组 put_lists = arr_size(list,1000) #调用主函数 print(tf_idf(list,put_lists,num))
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。