Python分析【标题党】文章 青旅半醒 2021-11-10 14:31 276阅读 0赞 这是一篇迟来的推送。 # 写作缘由 # 这是很久前一个好友给我的一个小任务:给出某平台历史文章数据,分析出哪些文章有”标题党“的嫌疑,哪些文章标题妙笔生花且内容名副其实。 分析一篇文章的标题起得好不好,无非看阅读量,但是怎么看”标题党“呢?我思索着,“标题党”文章大概是这样的:阅读量高但点赞数少,仔细想想,一篇文章,如果标题天花乱坠地吸引人,就会有许多读者点进去阅读,但是发现内容却是败笔,没有干货,这样的文章,会有许多读者给它点赞吗?显然不会。但是,这只是定性分析,怎么定量分析呢,在此需要利用最小二乘法做回归分析,先根据点赞数与阅读量的关系得到点赞数关于阅读量的回归直线,引入一个概念,文章优良指数,其定义为实际点赞数减去回归预测点赞数,取绝对值后再比上回归预测的点赞数,在推文时间等变量统计平均的前提下,如果这个值超过某个阈值(比如 0.5,可适当调整),那么就可认为该文章的内容是足够充实的,可评为优秀,相反地,如果这个比值远低于 0.5,则可认为该文章存在”标题党“嫌疑。 > 文章优良指数是我自己定义的概念,具有合理性但不具有权威性,其值=abs(实际点赞数-预测点赞数)/预测点赞数 理清思路后,开始动手实现。 # 编码实现 # ## 合并数据 ## 对于一篇文章,有价值的数据应该无外乎 标题、内容、点赞数、阅读数、内容和原文链接这几部分,但是原始数据是这样的: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lnZHh0_size_16_color_FFFFFF_t_70] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lnZHh0_size_16_color_FFFFFF_t_70 1] 文章标题和内容不在一个表中,而且数据大量冗余,我们要做的第一步就是数据清洗,把有用的数据合并到一个表中,并输出到文件,方便后续使用和查看。 这部分代码如下,主要是利用 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,"差的标题") ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lnZHh0_size_16_color_FFFFFF_t_70 2] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lnZHh0_size_16_color_FFFFFF_t_70 3] > 这些标题和具体文章作者的写作定位有关,仅供参考。 ### ”标题党“ 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) 其输出如下: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lnZHh0_size_16_color_FFFFFF_t_70 4] 为了方便查阅,将标题和内容名副其实的文章和具有“标题党”嫌疑的文章分别保存了下来,程序运行结束后自动保存在项目的目录下。 ![在这里插入图片描述][20190803114819249.png] 有了这些证据,拿去怼编辑,哈哈哈,逃~ ### 所有代码 ### 关注本微信公众号,**月小水长**,回复:**标题党**,即可获取。 ![在这里插入图片描述][20190803114931988.jpg] 可扫描关注~ [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lnZHh0_size_16_color_FFFFFF_t_70]: /images/20211109/c43b47293fbc4aa6bc7acfc06adf3cfc.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lnZHh0_size_16_color_FFFFFF_t_70 1]: /images/20211109/ddd9bfe963c24a5b891b60e5880847a2.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lnZHh0_size_16_color_FFFFFF_t_70 2]: /images/20211109/a0297d5ce829459ea308a195077d198b.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lnZHh0_size_16_color_FFFFFF_t_70 3]: /images/20211109/6ea0253971ab42ae89090230a002692e.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lnZHh0_size_16_color_FFFFFF_t_70 4]: /images/20211109/558996604d7144aa9961feb6b0c21c53.png [20190803114819249.png]: /images/20211109/0a7d09bc97f945668ee27ecf7b162e8c.png [20190803114931988.jpg]: https://img-blog.csdnimg.cn/20190803114931988.jpg
相关 文章标题 应用层open,write,read根据打开文件的属性找到对应的硬件或者存储设备驱动。 驱动框架 一、LED驱动框架 (1)、写出len\_open,len\_re ╰+哭是因爲堅強的太久メ/ 2022年07月14日 20:29/ 0 赞/ 28 阅读
相关 文章标题 > 原文: [ASM file number 7][] > 作者: Bane Radulovic > 译者:郭旭瑞,沃趣科技产品交付部经理,负责QData Cloud高 柔光的暖阳◎/ 2022年07月12日 11:26/ 0 赞/ 50 阅读
相关 文章标题 CSDN MarkDown语法写博客 二级标题 介绍内容 分隔线:空行,再加上三个横杠— 三级标题 无序列表项一 (横杠 加空格) 无序列表项一 不念不忘少年蓝@/ 2022年06月15日 09:23/ 0 赞/ 225 阅读
相关 文章标题 html部分 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> 小咪咪/ 2022年06月09日 13:39/ 0 赞/ 77 阅读
相关 文章标题 售票厅 【问题描述】 售票厅出售关于音乐会的票,取代原来的卖一张票的形式,而是一组座号连续的票。售票室已经收到很多预订。每个预订包含指定最小座号的一组连续的票。 售 ╰半夏微凉°/ 2022年06月09日 03:49/ 0 赞/ 258 阅读
相关 文章标题 用AJAX简单实现注册页面的用户名检测 js代码: <script> // 原生的方式使用AJAX // function getXMLHttpRequest( 旧城等待,/ 2022年06月09日 02:49/ 0 赞/ 290 阅读
相关 文章标题 状态模式 状态模式定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 状态模式主要解决的问题是:当控制一个对象状态转换的条件表达式过于复杂时的情 末蓝、/ 2022年06月05日 07:59/ 0 赞/ 294 阅读
相关 文章标题 apache端口被异常占用导致无法启动的解决方法 最近遇到LNMPA一键安装包的Apache无法启动的问题,Apache提示以下信息: (98)Address alre 红太狼/ 2022年06月03日 01:54/ 0 赞/ 277 阅读
相关 Python分析【标题党】文章 这是一篇迟来的推送。 写作缘由 这是很久前一个好友给我的一个小任务:给出某平台历史文章数据,分析出哪些文章有”标题党“的嫌疑,哪些文章标题妙笔生花且内容名副其实。 分 青旅半醒/ 2021年11月10日 14:31/ 0 赞/ 277 阅读
相关 文章标题 coding:utf-8 author = “xshengjing” from Tkinter import \ class App: def init(se Myth丶恋晨/ 2021年09月13日 22:56/ 0 赞/ 382 阅读
还没有评论,来说两句吧...