最近想了解下程序員能夠作什麼副業,我抓取了各大網站關於程序員搞副業的文章,但抓取的文章較多,爲了將類似的文章歸攏到一塊兒,我用聚類算法將文章劃分到不一樣的主題。下面我就來介紹一下分析的結論以及過程。文末回覆關鍵字便可獲取本次分析源碼。
本次分析的文章是從博客園、CSDN、知乎、今日頭條和微信上抓取,共140篇,聚類獲得的主題以下:html
-
接私活:主要是在碼市、程序員客棧等網站接項目作外包,對於接私活的評價你們褒貶不一,有的人決定接私活可以鍛鍊技術,但有的人以爲是重複勞動,可積累性差。我本身也接過私活,不建議程序員接私活,由於它至關因而工做時間的延伸,並無給你帶來其餘的可能性python
-
寫做:反對接私活的一部分人就提出來走寫做這條路,由於寫做一來能夠有深度的思考,二來也能夠沉澱技術,最後經過輸出的內容變現程序員
-
出書和錄視頻:看書和看視頻也是咱們學習技術的主要途徑,錄視頻是對技術能力和表達能力有更高的要求,相對而言寫書會容易一些。對於程序員來講若是常常寫原創博客,會有出版社的人員主動聯繫你。若是本身有時間、有能力的話能夠考慮寫本書,既能夠賺錢還能提升我的影響力。我去年就寫了一本小冊,這個過程當中確實須要付出不少時間和精力算法
-
小項目:這個相對於外包來講會好一些,原文做者舉了個例子,經過網上爬取公開的我的信息和聯繫方式,包裝成軟件出售,得到了不菲的收入數組
-
公衆號:經過公衆號積累流量,接廣告賺錢微信
-
投資學習:經過聚類分析發現有些文章的觀點畫風比較清奇,認爲程序員最大的副業是投資本身。這也是一條很好的路子,不斷地拓寬本身的知識廣度、打穿知識深度,可以在主營業務上創造出獨一無二的成果也是一種副業app
固然還有一些的關於討論程序員應不該該搞副業的主題也能聚在一塊兒,這裏就不舉例了,有興趣朋友能夠看詳細的分析數據。學習
下面來介紹下分析過程優化
數據抓取:需求比較明確,第一步找到文章搜索的入口,第二步找到文章詳情的入口。實現方案有兩種,第一種是請求接口;第二種是解析網頁HTML代碼。在本次分析中這兩種方案都有涉及,其中微信公衆號的數據抓取比較困難,我用的是開源的項目wechatsogou,這個項目直接用也是有各類問題,但我都解決了,須要注意的問題在源代碼中都有說明。因爲此次抓取的網站比較多,抓取這一步花費了60%的時間。數據清洗:主要目的是爲了保證咱們後續分析的數據是乾淨的,且沒有噪音。這裏我主要作了兩步,第一步限制文章的title包含「程序員」和「副業」,保證文章內容是可靠的;第二步經過BeautifulSoup取出HTML標籤,保證正文乾淨網站
# 過濾文章 def article_filter(article): title = article['title'] if '副業' in title and '程序員' in title: return True return False # 清洗正文,去掉html標籤 def content_clean(content): content_bs = BeautifulSoup(content) content_text = content_bs.get_text() content_text = re.sub('\n|\xa0', '', content_text) return content_text
特徵提取:由於咱們是做文本分析,因此咱們要將文本轉化成計算機能識別的數字特徵。轉化的方式有兩種,第一種詞袋空間VSM(vector space model),簡單來講它將一篇文章存儲爲一個數組,數組第n位的元素值表明該文章中第i個詞出現的頻次。而後經過TF-IDF計算第i個詞在這篇文章的權重。若是某個詞是文章的關鍵詞,那麼它的權重比其餘詞就大。因此若是兩篇表達的是同一個主題,那麼它倆的詞分佈以及詞的權重會很像,作聚類的時候天然就能聚到一塊兒;另外一種方式是將文檔轉化成向量,即:Doc2Vector。這裏主要介紹第一種方式,關於第二種源代碼也有涉及,有興趣的朋友能夠自行看源碼。
# 計算tf-idf 做爲每一個詞的權重 from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer # 統計詞頻 vectorizer = CountVectorizer(token_pattern=r"(?u)\b\w+\b") # 計算tf-idf transformer = TfidfTransformer() tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus)) # 權重矩陣, 二位數組,每行是一篇文章,每列是一個詞 weight_matrix = tfidf.toarray() # 特徵詞,數據,每一個元素是一個詞,也是weight_matrix第i列的詞 word = vectorizer.get_feature_names()
聚類分析:關於聚類的算法有不少,好比:K-Means、Birch、LDA和DBSCAN。本次分析中我用到了K-Means和Birch,這裏主要介紹K-Means的代碼。K-Means的思想比較簡單,就是將兩個距離較近的文章聚成一類。前面咱們已經將文章轉成向量了,因此能夠計算文章之間的距離。
# Kmeans 聚類 from sklearn.cluster import KMeans # 聚成 15 類 kmeans = KMeans(n_clusters=15) kmeans.fit(weight_matrix) # 聚類結果,存放第i篇文章屬於第幾類 kmeans.labels_
K-Means的用法也比較簡單,只需指定要最終聚出的類數量(n_clusters)便可。
效果評估:主要用來評估聚在一塊兒的文章是否真的是同一類,或者同一類的文章是否聚在了一塊兒。由於以前咱們計算了TF-IDF,咱們能獲取每篇文章的關鍵詞,因此我把每篇文章所在的類別、標題、以及關鍵詞輸出到文件,來進行評估
# 提取每篇文章最關鍵的5個詞 # keywords def get_key_words(weight, words): topk_weight = sorted(weight, reverse=True)[:5] min_weight = topk_weight[-1] max_weight = topk_weight[0] key_words = [] for index, x in enumerate(weight): if x >= min_weight: key_words.append(words[index]) return " ".join(key_words) f = open("cluster_res.txt", "w", encoding='utf-8') for index, label in enumerate(kmeans.labels_): kws = get_key_words(weight_matrix[index], word) raw = '%d\t%d\t%s\t%s\t%s\t%s\n' % (index,label, kws, attrs[index][0], attrs[index][1], attrs[index][2]) f.write(raw)
下面貼幾個case,聚類的效果還能夠
類別3是接私活相關的文章,類別6是投資學習的文章,類別7是出書和視頻的文章。本次分析過程就介紹到這裏,其實此次分析具體到每一個步驟可能沒作那麼細,好比:數據清洗、模型優化等,但整個流程還算比較完整。若是各位有興趣能夠自行深刻研究。
但願此次分析能對你有用,歡迎公衆號「渡碼」。公衆號回覆關鍵字 副業 便可得到完整源碼。
原文出處:https://www.cnblogs.com/duma/p/12650549.html