緒論
最近做課題,需要分析短文本的標簽,在短時間內學習了自然語言處理,社會標簽推薦等非常時髦的技術。我們的需求非常類似於從大量短文本中獲取關鍵詞(融合社會標簽和時間屬性)進行用戶畫像。這一切的基礎就是特征詞提取技術了,本文主要圍繞關鍵詞提取這個主題進行介紹(英文)。
不同版本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有了這些技巧,Python2和Python3就可以愉快地在一起玩耍了~
Python標准:https://www.python.org/dev/peps/pep-0397/
信息檢索概述
信息檢索是當前應用十分廣泛的一種技術,論文檢索、搜索引擎都屬於信息檢索的范疇。通常,人們把信息檢索問題抽象為:在文檔集合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
http://www.cnblogs.com/chenbjin/p/3851165.html
http://blog.csdn.net/liuxuejiang158blog/article/details/31360765?utm_source=tuicool&utm_medium=referral
http://blog.csdn.net/lsldd/article/details/41520953
http://blog.csdn.net/zhb_bupt/article/details/40985831
http://www.tuicool.com/articles/feIji2
參考文獻
- http://www.ruanyifeng.com/blog/2013/03/tf-idf.html
- https://news.cnblogs.com/n/161240/ (tf-idf的概率解釋)
- https://www.python.org/dev/peps/pep-0397/ (python不同版本共存官方文檔)
- http://mt.sohu.com/20160416/n444499895.shtml (python版本混用中文翻譯)
github代碼:
https://github.com/mirsamantajbakhsh/TFIDF
https://github.com/laertispappas/mapreduce_python
(分布式版本)