文本分析及可視化

好用的數據採集工具,造數科技

對於這篇文章,我想使用基本的關鍵字提取機制,來描述一個文本分析和可視化技術,只使用一個單詞計數器,從我的博客發布的文章語料庫中找到前3個關鍵字。 為了創建這個語料庫,我下載了我所有的博客文章(約1400篇),並且抓住了每篇文章的文字。 然後,我使用nltk和各種干預/縮小技術來標記帖子,計數關鍵字並取得前3名關鍵字。 然後,我將使用Gephi聚合所有帖子中的所有關鍵字以創建可視化。

我已經上傳了一個帶有完整代碼集的 jupyter notebook,您也可以下載csv文件。 需要安裝beautifulsoup 和nltk。 您可以安裝它們:

pip install bs4 nltkn

要開始,我們要導入需要的庫:

import pandas as pdnimport numpy as npn nfrom nltk.tokenize import word_tokenize, sent_tokenizenfrom nltk.corpus import stopwordsnfrom nltk.stem import WordNetLemmatizer, PorterStemmernfrom string import punctuationnfrom collections import Countern nfrom collections import OrderedDictnimport renimport warningsnwarnings.filterwarnings("ignore", category=DeprecationWarning)n nfrom HTMLParser import HTMLParsernfrom bs4 import BeautifulSoupn

有一個關於BeautifulSoup的警告,我們可以忽略。

現在,我們來設定一些我們需要的工作。

首先,我們設置我們的停止詞,詞幹和引語詞。

porter = PorterStemmer()nwnl = WordNetLemmatizer() nstop = stopwords.words(english)nstop.append("new")nstop.append("like")nstop.append("u")nstop.append("it")nstop.append("s")nstop.append("nt")nstop.append(mr.)nstop = set(stop)n

現在,我們構建一些需要的函數。

tokenizer函數取自此處。 如果你想看到一些很酷的主題建模,閱讀如何挖掘新聞源數據並提取Python中的互動式洞察...

它是一個非常好的文章,進入主題建模和聚類...我以後也會在這裡發文章。

# From http://ahmedbesbes.com/how-to-mine-newsfeed-data-and-extract-interactive-insights-in-python.htmlnndef tokenizer(text):nn tokens_ = [word_tokenize(sent) for sent in sent_tokenize(text)]nn tokens = []n for token_by_sent in tokens_:n tokens += token_by_sentnn tokens = list(filter(lambda t: t.lower() not in stop, tokens))n tokens = list(filter(lambda t: t not in punctuation, tokens))n tokens = list(filter(lambda t: t not in [u"s", u"nt", u"...", u"", u``, u, u, u], tokens))n n filtered_tokens = []n for token in tokens:n token = wnl.lemmatize(token)n if re.search([a-zA-Z], token):n filtered_tokens.append(token)nn filtered_tokens = list(map(lambda token: token.lower(), filtered_tokens))nn return filtered_tokensn

接下來,我在我的文章中有一些HTML,所以在做任何事之前,我想把它的文本中刪除。這裡是一個使用bs4的class。 我在Stackoverflow上找到了這個代碼。

class MLStripper(HTMLParser):n def __init__(self):n self.reset()n self.fed = []n def handle_data(self, d):n self.fed.append(d)n def get_data(self):n return .join(self.fed)n ndef strip_tags(html):n s = MLStripper()n s.feed(html)n return s.get_data()n

好的,現在是有趣的東西,要獲取我們的關鍵字,我們只需要2行代碼。 此函數計數並返回所述關鍵字數量給我們。

def get_keywords(tokens, num):n return Counter(tokens).most_common(num)n

最後,我創建了一個函數來獲取填充urls / pubdate / author / text的pandas 數據框,然後從中創建我的關鍵字。 這個函數遍歷一個pandas 數據框(每一行是我博客中的一篇文章),用「關鍵字」,「文章的標題」以及文章的發布數據來標記「文本」並返回pandas 數據框。

def build_article_df(urls):n articles = []n for index, row in urls.iterrows():n try:n data=row[text].strip().replace("", "")n data = strip_tags(data)n soup = BeautifulSoup(data)n data = soup.get_text()n data = data.encode(ascii, ignore).decode(ascii)n document = tokenizer(data)n top_5 = get_keywords(document, 5)n n unzipped = zip(*top_5)n kw= list(unzipped[0])n kw=",".join(str(x) for x in kw)n articles.append((kw, row[title], row[pubdate]))n except Exception as e:n print en #print datan #breakn passn #breakn article_df = pd.DataFrame(articles, columns=[keywords, title, pubdate])n return article_dfn

是時候載入數據並分析了。 這些代碼在我的博客文章(在這裡找到),然後僅從數據中獲取有趣的列,重命名它們並準備它們進行標記化。 大多數在讀取csv文件時可以一行完成,但是我已經為另一個項目寫了這個文件,就像它一樣。

df = pd.read_csv(../examples/tocsv.csv)ndata = []nfor index, row in df.iterrows():n data.append((row[Title], row[Permalink], row[Date], row[Content]))ndata_df = pd.DataFrame(data, columns=[title ,url, pubdate, text ])n

使用 tail() 有以下結果

現在,我們可以通過調用我們的 build_article_df 函數來標記和執行我們的字數。

article_df = build_article_df(data_df)n

這為我們提供了一個新的dataframe ,每個文章的前3個關鍵字(以及文章的標題和標題)。

這本身很酷。 我們使用一個簡單的計數器自動生成每個文章的關鍵字。 不是非常複雜,但它起作用。 有很多其他的方法可以做到這一點,但現在我們將堅持這一點。 除了關鍵字之外,看看這些關鍵字是如何與其他關鍵字「連接」可能是有趣的。 例如,「data」在其他文章中出現了幾次?

有多種方法來回答這個問題,但是一種方法是通過在拓撲/網路映射中可視化關鍵字來查看關鍵字之間的連接。 我們需要對我們的關鍵字進行「計數」,然後構建一個共現矩陣。 這個矩陣是我們可以導入Gephi來進行可視化的。 我們可以使用networkx繪製網路地圖,但是從沒有大量工作的角度來看,很難從中獲得有用的東西...使用Gephi對用戶更加友好。

我們有我們的關鍵字,需要一個共現矩陣。 要完成這個目標,我們需要採取幾個步驟來單獨地分解關鍵字。

keywords_array=[]nfor index, row in article_df.iterrows():n keywords=row[keywords].split(,)n for kw in keywords:n keywords_array.append((kw.strip( ), row[keywords]))nkw_df = pd.DataFrame(keywords_array).rename(columns={0:keyword, 1:keywords})n

我們現在有一個關鍵字dataframe kw_df,其中包含兩個列:關鍵字和關鍵字

目前這並沒有太大的意義,但是我們需要兩列來構建一個共現矩陣。 我們通過迭代每個文檔關鍵字列表(關鍵字列)來查看關鍵字是否包含在內。 如果是,我們添加到我們的出現矩陣,然後構建我們的共存矩陣。

document = kw_df.keywords.tolist()nnames = kw_df.keyword.tolist()nndocument_array = []nfor item in document:n items = item.split(,)n document_array.append((items))nnoccurrences = OrderedDict((name, OrderedDict((name, 0) for name in names)) for name in names)nn# Find the co-occurrences:nfor l in document_array:n for i in range(len(l)):n for item in l[:i] + l[i + 1:]:n occurrences[l[i]][item] += 1nnco_occur = pd.DataFrame.from_dict(occurrences )n

現在,我們在co_occur dataframe中有一個共存矩陣,可以將其導入Gephi以查看節點和邊的映射。 將co_occur dataframe保存為用於Gephi的CSV文件(您可以在此下載矩陣的副本)。

co_occur.to_csv(out/ericbrown_co-occurancy_matrix.csv)n

應用到Gephi

現在,是時候上手Gephi了。 我是個新手,所以不能真正給你很多的教程,但我可以告訴你需要採取的步驟來構建一個網路地圖。 首先,導入共同矩陣csv文件,然後導入電子表格,並將所有內容保留為默認值。 然後,在「overview」選項卡中,您將看到一堆節點和連接,如下圖所示。

ericbrown.com文章子集的網路地圖

接下來,向下移動到「layout」部分,然後選擇Fruchterman Reingold布局,然後按「run」以使地圖重畫。 在某些時候,您需要在屏幕上放下節點後按「stop」。 你應該看到下面的內容。

ericbrown.com文章子集的網路地圖

嗯? 現在...讓我們給圖片上色。 在「appearance」部分中,選擇「nodes」,然後選擇「ranking」。 選擇「Degree」並點擊「apply」。 您應該看到網路圖形發生變化,現在有一些顏色與之相關聯。 您可以使用顏色來播放,但默認配色方案應如下所示:

現在仍然不是很有趣,文字/關鍵字在哪裡?

嗯,你需要轉到「overview」標籤看看。 您應該看到如下所示(在下拉菜單中選擇「Default Curved」後)。

現在這很酷。您可以看到兩個非常不同的感興趣的領域。 「Data」和「Canon」...這是有道理的,因為我寫了很多關於數據和分享我的很多攝影(用Canon 相機拍攝)。

如果您有興趣,這裡是我所有1400篇文章的完整地圖。 再次,有兩個關於攝影和數據的主要集群,但還有一個圍繞「business」,「people」和「cio」的大型集群,這符合我多年來大部分的寫作習慣。

還有其他一些可視化文本分析的方法。 我正在計劃一些額外的文章,來談論我最近使用和運行的一些更有趣的方法。 敬請關注。

如果您想了解更多有關文本分析的信息,請查看這些書籍:

Text Analytics with Python: A Practical Real-World Approach to Gaining Actionable Insights from your Data

Natural Language Processing with Python: Analyzing Text with the Natural Language Toolkit

Text Mining with R

出處:Text Analytics and Visualization

作者:Eric Brown

推薦閱讀:

TAG:Python | 数据分析 | 语言 |