1. 程式人生 > >短文字分析----基於python的TF-IDF特徵詞標籤自動化提取

短文字分析----基於python的TF-IDF特徵詞標籤自動化提取

緒論

最近做課題,需要分析短文字的標籤,在短時間內學習了自然語言處理,社會標籤推薦等非常時髦的技術。我們的需求非常類似於從大量短文字中獲取關鍵詞(融合社會標籤和時間屬性)進行使用者畫像。這一切的基礎就是特徵詞提取技術了,本文主要圍繞關鍵詞提取這個主題進行介紹(英文)。

不同版本python混用(官方用法)

Python2 和python3 是一個神一般的存在,如何讓他們共存呢,直到我用了pycharm我才知道為啥這麼多人選擇它,如下圖所示配置兩個目錄直接可以混用了,叼炸天。

這裡寫圖片描述

插播一個廣告,想修改pycharm中python註釋的顏色找了半天居然得這麼搞:

這裡寫圖片描述

當大家搜尋如何在系統中混合使用python2和python3,國內網站經常會讓大家把其中一個python.exe改個名字,這樣區分開兩個可執行檔案的名字,但是這樣做有一個重大的隱患,就是修改了名字的那個python對應的pip將無法使用。有時候還是需要用用命令列的,怎麼辦?

  • 官方用法為:
      在安裝Python3(>=3.3)時,Python的安裝包實際上在系統中安裝了一個啟動器py.exe,預設放置在資料夾C:\Windows\下面。這個啟動器允許我們指定使用Python2還是Python3來執行程式碼(當然前提是你已經成功安裝了Python2和Python3)。
      
      如果你有一個Python檔案叫 hello.py,那麼你可以這樣用Python2執行它
      

    py -2 hello.py

      類似的,如果你想用Python3執行它,就這樣

    py -3 hello.py

      去掉引數 -2/-3
      
      每次執行都要加入引數-2/-3還是比較麻煩,所以py.exe這個啟動器允許你在程式碼中加入說明,表明這個檔案應該是由python2解釋執行,還是由python3解釋執行。說明的方法是在程式碼檔案的最開始加入一行
      

    #! python2

    或者

    #! python3

      分別表示該程式碼檔案使用Python2或者Python3解釋執行。這樣,執行的時候你的命令就可以簡化為
      

    py hello.py

  • 使用pip
      
      當Python2和Python3同時存在於windows上時,它們對應的pip都叫pip.exe,所以不能夠直接使用 pip install 命令來安裝軟體包。而是要使用啟動器py.exe來指定pip的版本。命令如下:
      

    py -2 -m pip install XXXX

      -2 還是表示使用 Python2,-m pip 表示執行 pip 模組,也就是執行pip命令了。如果是為Python3安裝軟體,那麼命令類似的變成
      

    py -3 -m pip install XXXX
      

  • #! python2 和 # coding: utf-8 哪個寫在前面?

      對於Python2使用者還有另外一個困惑,Python2要在程式碼檔案頂部增加一行說明,才能夠在程式碼中使用中文。如果指明使用的Python版本也需要在檔案頂部增加一行,那哪一行應該放在第一行呢?
      
      #! python2 需要放在第一行,編碼說明可以放在第二行。所以檔案開頭應該類似於:
      

    #!python2
    # coding: utf-8

資訊檢索概述

資訊檢索是當前應用十分廣泛的一種技術,論文檢索、搜尋引擎都屬於資訊檢索的範疇。通常,人們把資訊檢索問題抽象為:在文件集合D上,對於由關鍵詞w[1] … w[k]組成的查詢串q,返回一個按查詢q和文件d匹配度 relevance (q, d)排序的相關文件列表D。

對於這一基問題,先後出現了布林模型、向量模型等各種經典的資訊檢索模型,它們從不同的角度提出了自己的一套解決方案。

布林模型以集合的布林運算為基礎,查詢效率高,但模型過於簡單,無法有效地對不同文件進行排序,查詢效果不佳。

向量模型把文件和查詢串都視為詞所構成的多維向量,而文件與查詢的相關性即對應於向量間的夾角。不過,由於通常詞的數量巨大,向量維度非常高,而大量的維度都是0,計算向量夾角的效果並不好。另外,龐大的計算量也使得向量模型幾乎不具有在網際網路搜尋引擎這樣海量資料集上實施的可行性。

TF-IDF原理概述

如何衡量一個特徵詞在文字中的代表性呢?以往就是通過詞出現的頻率,簡單統計一下,從高到低,結果發現了一堆的地得,和英文的介詞in of with等等,於是TF-IDF應運而生。

TF-IDF不但考慮了一個詞出現的頻率TF,也考慮了這個詞在其他文件中不出現的逆頻率IDF,很好的表現出了特徵詞的區分度,是資訊檢索領域中廣泛使用的一種檢索方法。

Tf-idf演算法公式以及說明:

這裡寫圖片描述

具體實現如下所示,公式分成兩項,詞頻*逆詞頻,逆詞頻取log值。

這裡寫圖片描述

這裡寫圖片描述
注意分母中的+1,在很多文獻中並沒有出現,這個可能引發異常。

本人寫了一份程式碼近期正在修改,後續傳到github 上,再貼出來。文章末尾貼出了兩份我認為比較好的程式碼,一份是面向物件的實現一份是分散式的。

tfidf原始碼實現及相關部落格資料:

python scikit-learn計算tf-idf詞語權重(scikit-learn包中提供了tfidf的矩陣實現,缺點是詞數量過大可能溢位)
http://www.tuicool.com/articles/U3uiiu

參考文獻

github程式碼:

相關推薦

no