最近想了解下程序员可以做什么副业, 我抓取了各大网站关于程序员搞副业的文章, 但抓取的文章较多, 为了将相似的文章归拢到一起, 我用聚类算法将文章划分到不同的主题. 下面我就来介绍一下分析的结论以及过程. 文末回复关键字即可获取本次分析源码.
本次分析的文章是从博客园, CSDN, 知乎, 今日头条和微信上抓取, 共 140 篇, 聚类得到的主题如下:
接私活: 主要是在码市, 程序员客栈等网站接项目做外包, 对于接私活的评价大家褒贬不一, 有的人决定接私活能够锻炼技术, 但有的人觉得是重复劳动, 可积累性差. 我自己也接过私活, 不建议程序员接私活, 因为它相当于是工作时间的延伸, 并没有给你带来其他的可能性
写作: 反对接私活的一部分人就提出来走写作这条路, 因为写作一来可以有深度的思考, 二来也可以沉淀技术, 最后通过输出的内容变现
出书和录视频: 看书和看视频也是我们学习技术的主要途径, 录视频是对技术能力和表达能力有更高的要求, 相对而言写书会容易一些. 对于程序员来说如果经常写原创博客, 会有出版社的人员主动联系你. 如果自己有时间, 有能力的话可以考虑写本书, 既可以赚钱还能提高个人影响力. 我去年就写了一本小册, 这个过程中确实需要付出很多时间和精力
- # 过滤文章
- 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
- # 计算 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()
- # Kmeans 聚类
- from sklearn.cluster import KMeans
- # 聚成 15 类
- kmeans = KMeans(n_clusters=15)
- kmeans.fit(weight_matrix)
- # 聚类结果, 存放第 i 篇文章属于第几类
- kmeans.labels_
- # 提取每篇文章最关键的 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)
来源: https://www.cnblogs.com/duma/p/12650549.html