来源 | 月小水长(ID:inspurer)月小水长

写作缘由

这是很久前一个好友给我的一个小任务:给出某平台历史文章数据,分析出哪些文章有”标题党“的嫌疑,哪些文章标题妙笔生花且内容名副其实。

分析一篇文章的标题起得好不好,无非看阅读量,但是怎么看”标题党“呢?我思索着,“标题党”文章大概是这样的:阅读量高但点赞数少,仔细想想,一篇文章,如果标题天花乱坠地吸引人,就会有许多读者点进去阅读,但是发现内容却是败笔,没有干货,这样的文章,会有许多读者给它点赞吗?显然不会。但是,这只是定性分析,怎么定量分析呢,在此需要利用最小二乘法做回归分析,先根据点赞数与阅读量的关系得到点赞数关于阅读量的回归直线,引入一个概念,文章优良指数,其定义为实际点赞数减去回归预测点赞数,取绝对值后再比上回归预测的点赞数,在推文时间等变量统计平均的前提下,如果这个值超过某个阈值(比如 0.5,可适当调整),那么就可认为该文章的内容是足够充实的,可评为优秀,相反地,如果这个比值远低于 0.5,则可认为该文章存在”标题党“嫌疑。

文章优良指数是我自己定义的概念,具有合理性但不具有权威性,其值=abs(实际点赞数-预测点赞数)/预测点赞数

理清思路后,开始动手实现。

编码实现

合并数据

对于一篇文章,有价值的数据应该无外乎标题、内容、点赞数、阅读数、内容、原文链接这几部分,但是原始数据是这样的:



文章标题和内容不在一个表中,而且数据大量冗余,我们要做的第一步就是数据清洗,把有用的数据合并到一个表中,并输出到文件,方便后续使用和查看。

这部分代码如下,主要是利用 pandas 库进行加载、输出文件操作,值得一说的是 pandas.merge() 函数,这是 pandas 类数据库内连接的操作的一个函数,内连接定义如下:两个或多个表在指定列上进行匹配,我这里是一个列”标题“,因为标题相同的就是一篇文章,可以进行合并,如果左边(第一个表)的”标题“没有出现在右边(第二个表),或者右边的”标题“没有出现在左边,那么这些数据都会被舍弃,只保留匹配上的;与内连接相对应的就是外连接,外连接又分为左外连接和右外连接,顾名思义,左外连接就是也保留那些出现在左边但是并不和右边匹配的记录。

EXPORT_FILE_NAME = "【数据清洗后】.xlsx"
if not os.path.exists(EXPORT_FILE_NAME):
    ## 从 excel 中加载数据
    df1 = pd.read_excel("【历史文章】.xlsx")
    ## 截取指定的列
    data1 = df1[['标题', '点赞数', '阅读数']]
    df2 = pd.read_excel("【文章内容】.xlsx")
    data2 = df2[['标题', '文本内容', '文章链接']]
    # # 过滤掉文本内容里面的换行符
    # data2['文本内容'].apply(lambda text: text.replace('[\r\n]', ''))
    # print(dir(df1))
    # 内连接,合并 data1 和 data2 在“标题”上匹配的元组,不保留未匹配的元组
    data = pd.merge(data1, data2, how="inner", on="标题")
    # 将清洗过的数据输出到 excel 中, index = False 的目的是不再自动创建行索引
    data.to_excel(EXPORT_FILE_NAME, index=False)
    print(data)
else:
    data = pd.read_excel(EXPORT_FILE_NAME)

分析数据

“好标题” or “差标题”?

我们约定,那些阅读量排在前 20% 的文章,其”标题“被定义为”好标题“,排在后 20% 的,被定义为”差标题“。

# 前 20% 阅读量的标题被定义为好标题
# 后 20% 阅读量的标题被定义为差标题
threshold = ceil(data.shape[0] * 0.2)
best_titles = data.nlargest(threshold,'阅读数')
worst_titles = data.nsmallest(threshold,'阅读数')

用词云看看好的差的标题都有哪些关键词:

def WordcloudingKeywordsOfText(text,export_filename):
    cut_words = jieba.lcut(text)
    with open(export_filename+".txt",'w',encoding='utf-8') as f:
        f.write("/".join(cut_words))
    WC = WordCloud(
        font_path='my_font.ttf',
        background_color="#ffffff",
        max_words=2000,
        mask=imread('wordcloud_back.png'),
        random_state=42
    )
    WC.generate("".join(jieba.lcut(text))
)
    plt.figure(export_filename)
    plt.imshow(WC)
    plt.axis("off")
    WC.to_file(export_filename+".png")
    ...
WordcloudingKeywordsOfText(best_titles_text,"好的标题")
WordcloudingKeywordsOfText(worst_titles_text,"差的标题")



这些标题和具体文章作者的写作定位有关,仅供参考。

“标题党” or “实力派”?

所谓方法论决定世界观,思想指导行动,下面写的代码都是根据最上面对”标题党“特点的分析,一步步实现的,主要用到最小二乘法思想和我自定义的文章优良指数概念。

import matplotlib
from scipy import optimize
import numpy as np

# 设置中文字体和负号正常显示
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
read_num = data['阅读数'].values.tolist()
praise_num = data['点赞数'].values.tolist()
plt.figure()
plt.xlabel('阅读数')
plt.ylabel('点赞数')
plt.title('点赞数和阅读数分布图')
plt.scatter(x=read_num,y=praise_num,label="实际值")

# def line_fit(x,A,B):
#     return A*x + B
#
# # 直线拟合与绘制
# A1, B1 = optimize.curve_fit(line_fit, read_num, praise_num)[0]
# x1 = np.arange(min(read_num), max(read_num), 1000)
# y1 = A1 * x1 + B1
from sklearn.linear_model import LinearRegression
from scipy import vectorize

lr = LinearRegression()
lr.fit(np.array(read_num).reshape(-1,1),praise_num)
x1 = np.array(read_num).reshape(-1,1)
y1 = lr.predict(x1)
# 对 np.array 每个元素取整操作,应用scipy.vectorize()函数
y1 = vectorize(lambda x:ceil(x))(y1)
plt.plot(x1,y1,"y",linewidth=3,label="最小二乘法拟合")

# 增加一列
data['预测点赞数'] = y1

should_better_title_data = data[data['点赞数']>data['预测点赞数']*(1.5)]
title_pie_data = data[data['点赞数']<data['预测点赞数']*(0.5)]

sbtd_x = should_better_title_data['阅读数'].values.tolist()
sbtd_y = should_better_title_data['点赞数'].values.tolist()
plt.scatter(x=sbtd_x,y=sbtd_y,label="标题有待优化的文章(覆盖了部分实际值)",c='green')

tpd_x = title_pie_data['阅读数'].values.tolist()
tpd_y = title_pie_data['点赞数'].values.tolist()
plt.scatter(x=tpd_x,y=tpd_y,label="有标题党风险的文章(覆盖了部分实际值)",c='red')

plt.legend()
plt.show()

should_better_title_data.to_excel("标题有待优化的文章.xlsx",index=False)

title_pie_data.to_excel("有标题党风险的文章.xlsx",index=False)

其输出如下:


为了方便查阅,将标题和内容名副其实的文章和具有“标题党”嫌疑的文章分别保存了下来,程序运行结束后自动保存在项目的目录下。


有了这些证据,拿去怼编辑,哈哈哈,逃~

所有代码

https://github.com/inspurer/wechat_posted_analysis.git

AI 开发者大会精彩提前看

2019 AI开发者大会重磅嘉宾更新:阿里、华为、Google Brain、Amazon、微软中国、百度、京东、小米、快手、科大讯飞、商汤、旷视、图森、云知声、思必驰...“硬核AI技术大会,一年参加一次就够了”。更多嘉宾和大会信息请扫码查看 。

推荐阅读:

  • 吐血整理!140种Python标准库、第三方库和外部工具都有了

  • 别再说学不会:超棒的Numpy可视化学习教程来了!

  • 如何用爬虫技术帮助孩子秒到心仪的幼儿园(基础篇)

  • Python传奇:30年崛起之路

  • 干货 | Python后台开发的高并发场景优化解决方案

  • 2019年最新华为、BAT、美团、头条、滴滴面试题目及答案汇总

  • 阿里巴巴杨群:高并发场景下Python的性能挑战

你点的每个“在看”,我都认真当成了喜欢

Python分析那些“标题党”文章相关推荐

  1. Python分析【标题党】文章

    这是一篇迟来的推送. 写作缘由 这是很久前一个好友给我的一个小任务:给出某平台历史文章数据,分析出哪些文章有"标题党"的嫌疑,哪些文章标题妙笔生花且内容名副其实. 分析一篇文章的标 ...

  2. 厉害!「标题党」文章都能用 Python 分析出来

    在公众号看过那么多文章,有些文章的标题忍不住让你点进去,结果进去一看,标题党啊,有点失望.今天来用 Python 分析什么样的文章有"标题党"的嫌疑,而哪些文章标题妙笔生花且内容名 ...

  3. python生成文章标题_标题党文章生成器

    前段时间"狗屁不通文章生成器"广受好评.受该项目的启发,我编写了标题党文章生成器. 今天推文写点啥的发生,到底需要如何做到,不今天推文写点啥的发生,又会如何产生.了解清楚今天推文写 ...

  4. python英文词频统计-Python实现统计英文文章词频的方法分析

    本文实例讲述了Python实现统计英文文章词频的方法.分享给大家供大家参考,具体如下: 应用介绍: 统计英文文章词频是很常见的需求,本文利用python实现. 思路分析: 1.把英文文章的每个单词放到 ...

  5. 利用Python分析文章词频,并生成词云图

    利用Python分析文章词频,并生成词云图 使用request模块获取文章数据 import jieba import requests import csv from bs4 import Beau ...

  6. python简答题及答案查询公众号和软件_用Python分析了微信公众号

    本文是一篇基于 Python 的数据分析实践教程,数据来源于"Python之禅"公众号的历史文章,完整源代码和数据可以在公众号"Python之禅"回复「wxda ...

  7. 盛夏海边,用Python分析青岛哪些景点性价比高

    作者 | 志斌 来源 | 志斌的python笔记 头图 | 付费下载于 IC Photo 在经过几年的热潮之后,人工智能AI算法已经在各行各业广泛使用了.例如在工业制造中,利用人工智能监测仪器仪表.人 ...

  8. 用Python分析《红楼梦》:见证了贾府的兴衰,你是否还能“笑道”世事无常

    没读过<红楼梦>也能知道前后四十回是不是一个作者写的?很久以前,数据侠黎晨,用机器学习的算法分析了<红楼梦>,认为后四十回和前八十回内容上有明显差距.不过,数据侠楼宇却不这么认 ...

  9. Python + Selenium 自动发布文章(二):简书

    Python + Selenium 自动发布文章系列: Python + Selenium 自动发布文章(一):开源中国 Python + Selenium 自动发布文章(二):简书 Python + ...

最新文章

  1. php adodb smarty,smarty+adodb+部分自定义类的php开发模式
  2. VTK:绘图之PlotLine3D
  3. jacoco统计server端功能测试覆盖率
  4. python记事本_python记事本实现查询替换
  5. ajax怎么找回地址栏,使用ajax和window.history.pushState无刷新改变页面内容和地址栏URL...
  6. mvc VIEW部分介绍
  7. 二十二、K8s集群设置4-网络策略与校验和
  8. 三分钟解决Matlab中文乱码问题
  9. android逆向学习路线(适合新手)
  10. 友华PT925E,电信天翼网关3.0,光猫超级密码获取最简便方式
  11. 芒种时节,某地为何无人收割小麦?
  12. MySQL批量造数据
  13. netty 学习笔记(一)
  14. c语言数组五种排序法:bubble,choise,quick,insert,shell 和js 数组排序sort的区别
  15. 分贝测试软件哪个好 家庭影院,家庭影院隔音怎么做效果最好 这7个解决方案你一定要知道...
  16. 软件类大学生求职就业攻略(四)——求职面试
  17. 股票、期货、数字货币技术指标库TA-Lib
  18. mrtg流量图不更新了是怎么回事,谁有mrtg的安装及配置文档啊,求!!!
  19. 【文献学习】Complex-Valued Convolutions for Modulation Recognition using Deep Learning
  20. 猪:原来大数据都是骗“猪”的

热门文章

  1. Linux服务情书,Linux定时任务给心爱的小姐姐发情书
  2. 电源硬件设计----升压(Boost)变换器基础
  3. 假设检验 正态总体方差的假设检验
  4. Visual SLAM笔记
  5. oracle转trs,TRS数据库数据的导入导出2.doc
  6. python如何写生日快乐说说_一句祝自己生日快乐的说说
  7. 批量训练pytorch练习
  8. 【2020年第二届“网鼎杯”网络安全大赛 青龙组】Web AreUSerialz
  9. 用懊悔法学习吴恩达机器学习【1】
  10. 【前缀和】蓝桥杯试题 k倍区间