當前位置:
首頁 > 最新 > 以小見大——Python淺談的文本分析功能

以小見大——Python淺談的文本分析功能

各位小夥伴們大家好,又到了小D跟大家見面的時間啦!許久不見不知道大家有沒有想我呢?

小D對大家的思念之情可是如同滔滔江水般綿延不絕啊(此處禁止噓聲)!

今天小D給大家帶來的是什麼知識呢?各位看官稍安勿躁,請看下文

小D先放一張截圖吧,來自於日本著名動漫《命運石之門》:

相信大家平時在生活中也會遇見許多類似的場景。我們的世界充斥著大量形形色色的數字、文字以及圖片,在這個信息爆炸的時代,任何形式的數據背後,都可能藏有不為人知的秘密,需要數據分析人員敏銳捕捉並深入挖掘。傳統的財務分析主要著眼於數字,通過一系列多維度的財務指標,對個體進行全面分析,但是在這一過程中卻忽略了文字信息的重要性。此外,最常用也是最基礎的分析工具MicrosoftExcel在數字處理方面堪稱一把好手,然而在處理文字信息的時候表現並不盡如人意。因此,一款能夠有效處理文字信息的分析軟體就顯得至關重要。

好在,這個世界上還有一個叫做Python的東西,它包含的用於字元串匹配的正則表達式模塊,可以幫助我們非常完美地解決文本分析方面遇到的許多問題。

(有關Python的簡單介紹請參考小D之前的作品:想要學習數據分析?不知道這些軟體你可寸步難行)

話不多說,下面小D用一個具體的案例向大家展示如何運用Python優雅地進行文字處理。

我們知道,股票市場的成份股構成是一個不斷迭代的過程,從理論上來說,這一變動勢必會對股票價格造成影響。例如當一支股票宣布加入成份股,由於必須構築類似於股票指數的投資組合,指數基金(即以指數成份股為投資對象的基金)會大量買入這支股票,從而推動股價上升。那麼實際情況是什麼樣的呢?成份股變動的公告通常以文字的形式公布在官方媒體上,小D希望從中獲取公司名稱、公告日期兩類信息從而進行後續的研究。(敲黑板!!)由於市場信息在公布時就已經讓股價產生相應的調整,因此小D選擇公告日期而非實際變動日期,另外在本案例中我們以S&P500為例。不愛學習代碼的小夥伴們可以直接跳過案例部分,在本文的最後有針對正則表示式的文字性總結,看那個就好啦~

小D設法從相關資料庫下載了本案例所需的原始文本信息,如圖所示:

通過觀察可以發現,每篇公告都是一個獨立的個體,具有相對固定的形式。在開頭有我們需要的公告發布時間,之後的正文部分有我們需要的公司名稱。小D要做的便是將這兩項信息一一配對並提取出來,以合適的方式輸出。以下的所有操作均在Python中進行:

1

導入標準庫

Python本身的內置函數只佔總函數的很小一部分,如果需要調用其它的函數,在使用前必須先聲明調用標準庫。為了完成這次任務,小D需要用到正則表達式,在最後還需要將結果合適的方式輸出,因此需要調用兩個標準庫:re(regularexpression,即正則表達式)和csv。代碼如圖:

2

基礎數據加工

導入Python後的原始數據尚未達到要求,並不能直接用於數據提取。小D通過一系列的替換(replace)命令,消除掉文本中所有的空行和特殊符號,並按照日期將整個文本切片,保證日期和對應的公司名稱處在同一個切片中,為之後的數據提取創造條件。

3

公告時間提取

在處理好的最終數據中,公告時間位於每一行的開頭,以20XX結尾。因此使用如下的正則表達式得到我們想要的結果:

其中,等號左邊的anndate用來存放提取後得到的公告時間,等號右邊的re表示調用re標準庫中的函數,findall是re庫中特有的函數,它的作用是將字元串中與正則表達式相符的部分提取出來,括弧中的兩部分是findall函數需要的參數,sentence代表每一則公告。黃色的部分是整個語句的核心,其中「^」代表每一行的開頭,「.」代表任何一個字元,+?代表在非貪婪匹配下重複一個字元一次或者多次,意思是在正則表達式匹配成功的前提下,儘可能少的匹配,保證所得的結果是最短的結果。整個表達式的含義是,從每則公告的開頭開始,截取所有的字元,一直到數字20XX為止,就得到了我們需要的時間。

4

公司名稱提取

接著,我們需要獲取的是公司名稱,具體來說類似於從「S&PMidCap 400 constituent Health Care REIT Inc. (NYSE: HCN) will replaceSovereign Bancorp Inc. (NYSE: SOV) in the S&P 500」將「HealthCare REIT Inc. (NYSE: HCN)」取出。同樣的,我們使用如下的正則表達式:

與之前一樣,「.」代表任何一個字元,「+?」代表非貪婪匹配,整個語句的意思是將constituent和will之間的所有文字取出,賦值給變數add0,便得到了公司名稱。

5

輸出結果

最後,我們將提取出的日期和公司名稱一一匹配,並且以csv的格式輸出,代碼如下:

首先將anndate和add0兩個變數用zip函數進行一一配對,其實質是把兩個變數集變成了一個,然後調用csv庫中的writer函數將最終結果按行輸出,放入add_company這個csv文件中,最終結果如圖所示:

自此大功告成。怎麼樣,是不是很神奇!

當然,任何的計算機程序都還無法達到與人腦媲美的程度。小D在向大家展示Python文本分析的強大功能的同時,也必須說明它的局限性。首先,原始的分析材料需要具有一定的規律性,例如案例中的公告時間出現在每篇公告固定的位置,這就給我們提供了很大的便利,如果文本本身雜亂無章無規律可循,那麼整個代碼的複雜程度就會大大提高。其次,出現在語句中的文字信息提取難度相對來說較低,如果所需信息處於表格或者其它的形式當中,提取難度也會增加。最後,正則表達式進行的是嚴格的精確匹配,導致在提取大量信息時,可能有部分信息因為與表達式有微小的區別而被遺漏,最終的結果完整性無法達到完美。這些問題,都有待大家在實際使用過程中深入思考並解決。但無論如何,Python都是一款極佳的分析軟體,為我們打開了文本分析的大門,使我們的數據分析結果更加完善可靠。

本文僅僅是對正則表達式的一個非常簡單的介紹,如果小夥伴們有進一步學習的興趣,小D推薦大家搜索正則表達式的相關文獻,可以得到非常詳盡的解釋。至於如何將正則表達式應用於漢字,就留給大家自己去探索啦~朋友們,我們下期再見!


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

一個小白是如何失敗多次逆襲成功,最終學會Python編程的!
淺入深談:秒懂python編程中的if

TAG:Python |