91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python怎么實現TF-IDF算法解析

發布時間:2021-03-23 09:55:27 來源:億速云 閱讀:240 作者:小新 欄目:開發技術

小編給大家分享一下python怎么實現TF-IDF算法解析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

TF-IDF(term frequency–inverse document frequency)是一種用于信息檢索與數據挖掘的常用加權技術。

同樣,理論我這里不再贅述,因為和阮一峰大神早在2013年就將TF-IDF用一種非常通俗的方式講解出來

TF-IDF與余弦相似性的應用(一):自動提取關鍵詞

材料

1.語料庫(已分好詞)
2.停用詞表(哈工大停用詞表)
3.python3.5

語料庫的準備

這里使用的語料庫是《人民日報》2015年1月16日至1月18日的發表的新聞。并且在進行TFIDF處理之前已經進行了人工分詞(當然也可以使用jieba分詞,但效果不好)

三天的新聞篇章數量如下:

python怎么實現TF-IDF算法解析 

語料庫中共103篇新聞。每篇新聞存入在txt文件中,編碼為UTF-8無BOM

這里放一篇文章示例下:

python怎么實現TF-IDF算法解析

我在自己的項目路徑下新建一個corpus的文件夾,用于存放已經分好詞待計算的語料。corpus文件夾的架構如下:

python怎么實現TF-IDF算法解析

2015年1月16日至1月18日共三天,每天可獲取的新聞分了四版,因此針對每一天下的每一版我又分別建了編號為1、2、3、4的文件夾,用于存放每一版的新聞。

其實也沒必要這么麻煩,可以直接把所有的新聞都放到一個文件夾下,只是我個人的文件管理習慣。當然放到數據庫里面更好。

關于停用詞表

較好用的停用詞表有哈工大停用詞表、百度停用詞表、川大停用詞表,網上一查一大堆。我這里選擇的是哈工大停用詞表。

代碼實現

# -*- coding: utf-8 -*-
# @Date   : 2017-04-11 09:31:55
# @Author  : Alan Lau (rlalan@outlook.com)
# @Language : Python3.5
import os
import codecs
import math
import operator


def fun(filepath): # 遍歷文件夾中的所有文件,返回文件list
  arr = []
  for root, dirs, files in os.walk(filepath):
    for fn in files:
      arr.append(root+"\\"+fn)
  return arr


def wry(txt, path): # 寫入txt文件
  f = codecs.open(path, 'a', 'utf8')
  f.write(txt)
  f.close()
  return path


def read(path): # 讀取txt文件,并返回list
  f = open(path, encoding="utf8")
  data = []
  for line in f.readlines():
    data.append(line)
  return data


def toword(txtlis): # 將一片文章按照‘/'切割成詞表,返回list
  wordlist = []
  alltxt = ''
  for i in txtlis:
    alltxt = alltxt+str(i)
  ridenter = alltxt.replace('\n', '')
  wordlist = ridenter.split('/')
  return wordlist


def getstopword(path): # 獲取停用詞表
  swlis = []
  for i in read(path):
    outsw = str(i).replace('\n', '')
    swlis.append(outsw)
  return swlis


def getridofsw(lis, swlist): # 去除文章中的停用詞
  afterswlis = []
  for i in lis:
    if str(i) in swlist:
      continue
    else:
      afterswlis.append(str(i))
  return afterswlis


def freqword(wordlis): # 統計詞頻,并返回字典
  freword = {}
  for i in wordlis:
    if str(i) in freword:
      count = freword[str(i)]
      freword[str(i)] = count+1
    else:
      freword[str(i)] = 1
  return freword


def corpus(filelist, swlist): # 建立語料庫
  alllist = []
  for i in filelist:
    afterswlis = getridofsw(toword(read(str(i))), swlist)
    alllist.append(afterswlis)
  return alllist


def wordinfilecount(word, corpuslist): # 查出包含該詞的文檔數
  count = 0 # 計數器
  for i in corpuslist:
    for j in i:
      if word in set(j): # 只要文檔出現該詞,這計數器加1,所以這里用集合
        count = count+1
      else:
        continue
  return count


def tf_idf(wordlis, filelist, corpuslist): # 計算TF-IDF,并返回字典
  outdic = {}
  tf = 0
  idf = 0
  dic = freqword(wordlis)
  outlis = []
  for i in set(wordlis):
    tf = dic[str(i)]/len(wordlis) # 計算TF:某個詞在文章中出現的次數/文章總詞數
    # 計算IDF:log(語料庫的文檔總數/(包含該詞的文檔數+1))
    idf = math.log(len(filelist)/(wordinfilecount(str(i), corpuslist)+1))
    tfidf = tf*idf # 計算TF-IDF
    outdic[str(i)] = tfidf
  orderdic = sorted(outdic.items(), key=operator.itemgetter(
    1), reverse=True) # 給字典排序
  return orderdic


def befwry(lis): # 寫入預處理,將list轉為string
  outall = ''
  for i in lis:
    ech = str(i).replace("('", '').replace("',", '\t').replace(')', '')
    outall = outall+'\t'+ech+'\n'
  return outall


def main():
  swpath = r'D:\Alan\myBlog\20170411《人民日報》TFIDF\code\哈工大停用詞表.txt'#停用詞表路徑
  swlist = getstopword(swpath) # 獲取停用詞表列表

  filepath = r'D:\Alan\myBlog\20170411《人民日報》TFIDF\corpus'
  filelist = fun(filepath) # 獲取文件列表

  wrypath = r'D:\Alan\myBlog\20170411《人民日報》TFIDF\result\TFIDF.txt'

  corpuslist = corpus(filelist, swlist) # 建立語料庫

  outall = ''

  for i in filelist:
    afterswlis = getridofsw(toword(read(str(i))), swlist) # 獲取每一篇已經去除停用的詞表
    tfidfdic = tf_idf(afterswlis, filelist, corpuslist) # 計算TF-IDF

    titleary = str(i).split('\\')
    title = str(titleary[-1]).replace('utf8.txt', '')
    echout = title+'\n'+befwry(tfidfdic)
    print(title+' is ok!')
    outall = outall+echout
  print(wry(outall, wrypath)+' is ok!')

if __name__ == '__main__':
  main()

運行效果:

python怎么實現TF-IDF算法解析

最終結果

這里放兩篇新聞的TFIDF

python怎么實現TF-IDF算法解析

python怎么實現TF-IDF算法解析

以上是“python怎么實現TF-IDF算法解析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

呼玛县| 当雄县| 平南县| 泉州市| 宾阳县| 民丰县| 申扎县| 仪征市| 海原县| 永仁县| 青浦区| 额敏县| 平顶山市| 宁安市| 彝良县| 龙井市| 东平县| 华阴市| 保德县| 宁波市| 望城县| 镇安县| 富川| 富蕴县| 阿坝| 白玉县| 和田市| 萨嘎县| 湖南省| 全椒县| 故城县| 维西| 兴宁市| 永安市| 界首市| 北辰区| 定日县| 福州市| 陇南市| 宿州市| 开阳县|