基于社交網絡挖掘公司潛在用戶
引言
作為銷售人員,在向客戶介紹公司的新產品或技術的時候,是否考慮過參考已有的客戶成功案例去說服新客戶?是否想要去發現某客戶可能采用的公司產品?是否希望去挖掘公司潛在的客戶?回答是肯定的。挖掘潛在客戶一直是每個公司重要的工作之一,準確的發現目標客戶并向其推薦其可能使用的產品或方案能夠幫助公司實現利益的增長。例如電子商務公司會根據個人瀏覽商品記錄推薦可能感興趣的其他商品;銀行會根據個人的消費記錄向其推薦適合的金融產品;娛樂媒體公司會根據個人的觀看歷史推薦其他相似的影片或音樂。
目前,社交網絡在人們的日常生活中扮演著越來越重要的角色,已成為人們交往和獲取信息的重要渠道。如何利用其包含的海量的具有時效性的非結構化數據引起了人們的關注。本文在這樣的背景下提出一種為公司挖掘潛在客戶的方法,從 推ter 和 LinkedIn 等社交媒體上提取信息,利用 Watson API 和 NLTK 分詞工具對這些信息進行處理,使用 Python 的主題模型工具包 Gensim 來進行公司之間的相似度計算,最后根據相似度計算結果為公司推薦潛在客戶。本文余下章節介紹了具體實現步驟。
1 從 推ter 上抓取推文
基于社交網絡挖掘公司潛在用戶,首先需要在社交網絡上搜索公司已有的成功案例。如 IBM 公司在 推ter 中注冊了一個名為 IBM Client Voices 的賬戶,其發布的推文包含了 IBM 的某項產品或技術幫助了某個公司完成了某項任務。
例如:
推文 1: @Runkeeper deploys @IBMcloudant to help blind runner @andadapt manage over 120,000 global data requests per second.
推文 2:" @IBMDB2 with pureScale enables real-time insight into where shipments are in our network, 24/7." Client @nscorp .
推文 3: @VON_Canada partners with #IBM to reduce senior citizen fall rate by a dramatic 72%. Read: http://ibm.co/28IArSG .
我們可以通過 推ter 提供的 API 來提取 IBM Client Voices 賬戶發布的所有推文。具體的步驟如下:
1.1 OAuth 授權
從 1.1 版本開始,使用 推ter API 需要通過 OAuth 授權,授權過程是通過發送 http GET/POST 進行的。
- 注冊申請 推ter 的開發者,創建 App,獲得開發者的 Key 和 Secret,即 consumer_key & consumer_secret。
- 用 Http 通過 推ter 提供的 API url + 參數 consumer_key & consumer_secret 到 推ter 的服務器獲取 request_token。
- 用 Http 通過 推ter 提供的 API url + 參數 request_token 到 推ter 服務器請求授權。
- 授權確認后頁面跳轉到由你之前注冊時填寫的 callback_url 為地址前綴的的一個新網址(頁面),并獲取到 oauth_verifer。
- 最后,再發送 request_token & oauth_verifier 到 推ter 服務器換取 access_token & access_token_secret, 有了這兩個值就可以通過它們進行各種 推ter 操作。
1.2 REST API
獲取 推ter 數據的常用方法是通過 REST API。使用通過 OAuth 授權得到的 tokens,我們的應用可以向 推ter 獲取特定的數據。獲取 推ter 數據的流程如圖 1 所示。
圖 1. 獲取 推ter 數據的流程
本文使用 API GET st atuses/user_timeline,來獲取某用戶所發布的推文。
使用下面語句(本文出現的代碼均以 Python 語言編寫),可以獲得用戶 id 為 IBMclientvoices 發布的最新 20 條推文。推文如圖 2 所示。
清單 1. 獲取到用戶最新發布的推文
api.user_timeline(id='IBMclientvoices', count=20, max_id=oldest_id-1)
圖 2. 從 推ter 上獲取的推文
從 推ter 上返回的數據為 JSON 格式,我們從 JSON 返回結果中抽取下列信息(如表 1 所示),并存入數據庫中。
表 1. 推文中抽取的信息
id | 推文的 id |
---|---|
author | 推文的作者 |
created_at | 推文的創建時間 |
text | 推文的內容 |
user_mentions | 推文中@的用戶 |
hashtags | 推文中涉及到 IBM 技術名字 |
其中 user_mentions 和 hashtags 為我們最為關注的公司名稱和產品或方案名稱。
2 從 LinkedIn 提取公司信息
至此關于公司已有的成功案例信息提取完畢,但是 推ter 中包含的公司信息有限,所以需要從其他的數據源中提取更多的關于各個公司的信息來完成進一步的數據挖掘,推薦工作。社交媒體 LinkedIn 中包含了更多的關于公司的信息,本文接下來介紹如何提取 LinkedIn 中的相關信息。
2.1 獲取授權
我們使用 LinkedIn 支持的 OAuth 2.0 協議來進行授權。授權成功后,就可以通過調用 REST API 來與服務器進行交互。
- 首先在 LinkedIn 開發者網站
創建一個應用。
創建一個應用后,會獲得一組驗證秘鑰,包括客戶端編號(Client ID),以及客戶端密碼(Client Secret)。然后需要在創建的應用中添加授權重定向網址 Authorized Redirect URLs。
-
加載 WebView 獲得授權碼。
打開 WebViewController.swift 文件,添加必要的參數。當這些必要的參數都添加成功后,我們就在 WebView 中登錄了 LinkedIn 賬號,請求加載成功后,LinkedIn 服務器就會返回一個授權碼。
-
交換授權碼,獲取 Access Token。
通過 Access Token,我們可以向 LinkedIn 服務器發起授權請求,并通過 GET 或 POST 請求獲取信息。下圖展示了如何通過提供 Access Token 發起授權請求,并調用 API。
清單 1. 通過 Access Token 發起授權請求
application = LinkedInApplication(token = 'Your AccessToken')
2.2 調用 API 獲取公司信息
我們使用 LinkedIn 提供的 API LinkedInApplication 來進行關鍵字搜索。以從 推ter 推文中獲取的公司名稱為關鍵字,搜索所有相關的公司的信息。
該 API 所能返回與關鍵字相關的公司的多維度信息,包括 ID,公司名稱,公司網頁 URL,公司所處行業,公司介紹,公司領域,公司類型和規模等。
我們會從 API 返回的公司集合中,選擇返回結果中的第 1 個公司,即相似度最高的一個公司,與 推ter 推文中獲取的公司名稱再進行下一步的匹配。
清單 2. 調用 API 獲取公司信息
def link_search_comp(keyword): result_from_linkedin = application.search_company(selectors=[{'companies':['id', 'name', 'websiteurl','industries','description','specialties', '推ter-id','company-type','employee-count-range']}], params={'keywords':keyword}) if (result_from_linkedin['companies']['_total']>0): if(result_from_linkedin['companies']['values'][0].has_key('websiteUrl')==False): result_from_linkedin['companies']['values'][0]['websiteUrl']='' return result_from_linkedin['companies']['values'][0] return ''
2.3 匹配公司
為了絕對匹配 推ter 推文中所提到的公司與 LinkedIn 中的公司,我們采用匹配公司名稱和 URL 域名相結合的方式。首先,以 推ter 推文中涉及到的公司 name 域為關鍵字,通過該名稱在 Linkedin 中搜索,若搜索結果中的公司名稱和輸入的關鍵字完全匹配,則為公司匹配成功;若不完全匹配,則進一步判斷 推ter 和 Linkedin 公司的 URL 域名是否相同,同時,為了避免因為 推ter 中個人使用公司 URL 這種情況的存在而造成最終公司匹配錯誤,還需要判斷輸入關鍵字和搜索結果中公司名稱的字符串相似度是否達到給定閾值,以上兩個條件同時滿足時,公司匹配成功,否則,匹配失敗。若通過公司名稱方式匹配失敗,則繼續通過 URL 域名方式進行搜索,該方式將 推ter 中公司 URL domain 中的域作為關鍵字在 Linkedin 中進行搜索,若搜索結果中公司的 URL 域名和 推ter 中公司的 URL 域名相同,則匹配成功,否則失敗。利用上述匹配方法,通過統計可得 推ter 推文中所提到的公司,約 60%可在 LinkedIn 中一一匹配并能夠提取到其進一步的具體信息。
清單 3. 匹配公司
def link_compare_match(linkedin_result,推ter_result,method): linkedin_domain = get_format_domain(linkedin_result['websiteUrl']) 推ter_domain = 推ter_result.urls if (method == 'name'): if (推ter_domain==linkedin_domain): return YES elif(method=='domain'): if(linkedin_result['name'] == 推ter_result.name): return YES elif (推ter_domain==linkedin_domain and name_match(linkedin_result['name'], 推ter_result.name)==True): return YES return NO
對于這些匹配成功的公司,我們有了更詳盡的數據,包括公司所屬行業,專注的領域,公司規模,公司描述等等。通過這些豐富的信息,我們可計算得出不同公司之間的相似度,通過相似度來挖掘潛在客戶。
3 推薦算法
通過上面兩步操作,我們獲得了公司的描述(description),所屬行業(industry)以及公司的專屬領域(specialties),這幾個特性反映了公司的大部分特征。因此,本文可以依據這這些特征來計算公司間的相似度,通過公司特征間的匹配來進行公司間的匹配。為了提高公司之間的匹配度,本文通過 Watson 提供的關鍵字提取 API 來對公司的 description 域進行關鍵字提取,并和 specialties 域合并成為最終進行相似度匹配的文本信息。之后通過 Python 分詞工具包 NLTK 對合并后的文本分析,得到該領域公司信息的語料庫。最后通過 Gensim 工具中的 LSI 模型進行相似度計算。下面首先簡單介紹一下 LSI 模型。
3.1 LSI 模型
潛在語義分析(LSA)又被稱作潛在語義索引(LSI),是一種在自然語言處理中用到的技術,其將大量文本表示成矩陣,矩陣的每一行表示一個詞,每一列表示一篇文檔,矩陣的元素可以為詞頻或 TF-IDF 值。LSA 采用奇異值分解(SVD)對原始矩陣進行降維,得到原始矩陣的低階近似矩陣。之后,其使用余弦相似度公式計算兩個文本的相似度。通過 LSA 模型,可以很準確的計算出兩個文本信息之間的相似度。由于本文中的公司信息中有足夠的、包含公司特征的文本信息,所以本文采用 LSI 模型來進行公司之間的相似度計算。
3.2 關鍵字提取
為了使用 Watson API 進行關鍵字提取,需要在 Bluemix 平臺創建 AlchemyAPI 服務,服務創建完畢后會獲得一個認證秘鑰 API_KEY,使用該秘鑰才可以進行關鍵字提取 API 的調用。AlchemyAPI 提供了一組服務,支持企業和開發人員構建相關應用程序,本文用到的是其中的 AlchemyLanguage 服務。
AlchemyLanguage 是通過自然語言處理提供文本分析的 API 集合。借助 AlchemyLanguage,可以實現 Keyword Extraction、Entity Extraction、Sentiment Extraction、Emotion Analysis、Concept Tagging、Taxonomy Classification 等。本文使用了 Keyword Extraction 功能。
AlchemyLanguage 的具體使用步驟為:
- 獲取關鍵字提取服務
清單 5. 獲取關鍵字提取服務
alchemy_language=AlchemyLanguageV1(api_key='Your APIKEY')
- 指定輸出結果域,本文只需要提取 keyword 域即可
清單 6. 提取 keyword 域
combined_operations = ['keyword']
- 提取關鍵字
清單 7. 提取關鍵字
result = alchemy_language.combined(text=description, extract=combined_operations)
3.3 NLTK 分詞工具
NLTK 是基于 Python 的分詞工具,在使用 Gensim 計算相似度之前,必須要對公司關鍵字提取后的結果進行分詞處理,主要包括以下步驟:對文檔 text 分詞并小寫化、設置停用詞及標點符號集、去停用詞及標點符號。
經過以上分詞處理后,對指定領域內的每個公司,合并 description 的關鍵字和 specialties 成為 text,對每個公司重復上述步驟,最終得到某行業內(industry)公司信息的語料庫,該語料庫作為 Gensim 工具的輸入。
3.4 通過 Gensim 工具進行相似度計算
本文使用了 Python 版的 Gensim 工具,并以 4.4 節獲得的公司信息語料庫作為 Gensim 工具的輸入。令 texts 為指定公司信息語料庫,首先通過 texts 抽取一個"詞袋(bag-of-words)",將 texts 的 token 映射為 id,方法如下:
清單 8. texts 的 token 映射為 id 的方法
dictionary = corpora.Dictionary(texts)
然后將用字符串表示的文檔轉換為用 id 表示的文檔向量:
清單 9. 用 id 表示的文檔向量
corpus = [dictionary.doc2bow(text) for text in texts]
有了這些信息,就可以基于這些信息計算一個 TF-IDF 模型:
清單 10. 計算 TF-IDF 模型
tfidf = models.TfidfModel(corpus)
基于這個 TF-IDF 模型,就可以將上述詞頻表示的文檔向量表示為一個用 TF-IDF 值表示的文檔向量:
清單 11. 用 TF-IDF 值表示的文檔向量
corpus_tfidf = tfidf[corpus]
有了 tf-idf 值表示的文檔向量,就可以訓練一個 LSI 模型,并建立索引,在本文將 topic 數設置為 10,即將 TF-IDF 語料轉化為一個潛在 10-D 空間:
清單 12. 訓練 LSI 模型
lsi = models.LsiMoidel(corpus_tfidf,id2word=dictionary,num_topics=10) index = similarities.MatrixSimilarity(lsi[corpus])
基于 LSI 模型的索引建立完畢,通過 LSI 模型可以將公司 description 關鍵字和 specialties 組成的 query_word 映射到 10 個 topic 主題模型空間上,然后和其他公司計算相似度并存于 sims 列表中:
清單 13. 計算和其它公司的相似度并存在 sims 列表中
query_bow = dictionary.doc2bow(query_words) query_lsi = lsi[query_bow] sims = index[query_lsi]
4 系統推薦流程圖
至此,我們可以通過 推ter,LinkedIn 進行公司信息提取,信息處理,以及使用 LSI,奇異值分解(SVD)等方法計算公司間的相似度,并完成潛在客戶的挖掘與推薦。具體的推薦流程如圖 3 所示。
圖 3. 系統推薦流程圖
5 為用戶推薦 IBM 產品
由推文的提取過程可知,IBM Client Voice 發表的推文中包含 IBM 產品及其使用客戶,并可在數據庫中獲取指定用戶使用的 IBM 產品。為了給指定用戶推薦 IBM 的其他產品,首先需要獲取該用戶所屬行業內的其他用戶,然后通過上述步驟計算該用戶與同行業內的其他用戶的相似度,并將相似度達到某個閾值的用戶所使用的 IBM 產品推薦給該公司。具體的實現界面如圖 4 所示:
圖 4. IBM 產品推薦結果
6 為 IBM 產品挖掘潛在客戶
由于一個 IBM 產品可能有多個用戶使用,為了給某個 IBM 產品挖掘潛在客戶,必須獲取當前使用了該產品的用戶集,對于與該用戶集中的用戶相似度達到某個閾值的用戶即可作為該產品的潛在客戶。所以,對該用戶集中的每個用戶,計算與其同行業內用戶的相似度,從而獲得一個潛在客戶集。具體的實現界面如圖 5 所示:
圖 5. 潛在客戶推薦結果
7 總結
推薦已經廣泛使用于電子商務、電影和視頻網站、個性化音樂網絡電臺、社交網絡、網絡公開課等領域,但基于社交網絡為公司推薦潛在客戶的實踐卻很少見。挖掘潛在客戶是所有公司的強烈需求之一,因此,本文所述的推薦系統具有很強的實踐意義。為進一步提高潛在客戶推薦的準確性,接下來會關注于從更多的社交網絡中挖掘更多的數據源來豐富以往的成功案例,并挖掘關于各個公司更多的信息來提高相似度計算的準確性。
參考資源
- 查看 alchemyapi 介紹文檔 ,了解如何使用該服務。
- 查看 Bluemix 文檔中心 ,了解如何使用 Bluemix 平臺及其更多的服務。
- 參考 潛在語義分析(Latent semantic analysis)Wiki 頁面 ,了解更多關于 LSA 的內容。
- 參考 奇異值分解(Singular value decomposition)Wiki 頁面 ,了解更多關于 SVD 的內容。
- 參考 TF-IDF Wik i 頁面 ,了解更多關于 TF-IDF 的內容。
- 查看 推ter 開發者頁面 ,了解如何開發基于 推ter 的應用程序。
- 查看 Linkedi n 開發 者頁面 ,了解如何開發基于 Linkedin 的應用程序。
來自:http://www.ibm.com/developerworks/cn/analytics/library/ba-cn-socialmedia-customermining/index.html?ca=drs-