我是怎么分析一万篇AO3文章的

写在前面:

沸沸扬扬的227看来是告一段落了,这件事对我和豆酱的影响就是发现能发声引起大家的讨论和关注还是一件很有意思的事情,所以决定慢慢开始经营自己的号.基本保证每周更新一次.那我就尽量发挥我的优势,跟大家讲讲代码,聊聊技术.首先就把我在227文章和视频的技术都和大家讲个透彻.这里总共是四大部分:

  1. 基于 selenium 的爬虫,已经写过一期文章,还会有一篇;
  2. 基于词频统计的数据分析,就是本文;
  3. 基于深度学习的 NLP 文本分类器;
  4. 基于OpenCV 的图像视频制作.

这就够一个月了.新手初来乍到,谢谢大家支持.有什么感兴趣的可以评论或私信.我也会根据大家关系的东西写哦~



对文本进行分析

上一篇文章中已经对相关库进行简要介绍,这里我只列举文本分析时使用到的库.

BeautifulSoup: Html 标签解析器 jieba: 中文分词工具 wordcloud: 词云生成器 matplotlib: 科学绘图库 numpy: python数学运算库 PIL: python图像处理库

matplotlib 使用时要注意中文显示问题,matplotlib默认并不支持中文显示,需要进行一些配置.

具体步骤是:

  1. 通过 matplotlib.matplotlib_fname() 命令找到 matplotlib 路径;
  2. 将字体放在字体文件夹下,并修改配置文件
  3. 去掉 font.family , axes.unicode_minus 和 font.sans-serif 前的注释符#,
  4. 在 font.sans-serif 中添加字体名称(这里是 simhei),把 axes.unicode_minus 的值改为 False.
  5. 删掉 matplotlib 的缓存目录

在使用 Jupyter notebook 时,需要注意添加魔法命令 %pylab inline.

<code>import sys
import re
import os
import time
from tqdm import tqdm

import numpy as np
# import pandas as pd
from bs4 import BeautifulSoup
import jieba #分词
from wordcloud import WordCloud #词云
import matplotlib.pyplot as plt
import pylab
pylab.rcParams['font.family'] = 'simhei'
from PIL import Image
import time

%pylab inline/<code>

配置一些函数

然后定义几个通用函数,包括:

  • 从文件中按行读取(任意)词;
  • 在文本中查找是否有敏感词并返回;
  • 去除常用词;
  • 创建词云.

提示一下大家,读取词表和检查敏感词的计数部分是有Bug的,如果词表有重复的词,则敏感词会多记一次.这个在未来借助 NLP 生成句子检测器的工作中已经修复了.请大家注意一下.相关视频已经放在 B站 和 头条西瓜 有兴趣的小伙伴可以去看

<code>#读取词表
def read_words_list(path):
with open(path) as f:
lines = f.readlines()

strlist = []
for l in lines:
if '#' != l[0] and '' != l.strip():
l = l.strip()
strlist.append(l)
return strlist

#查找敏感词
def check_sens_words(text, sens_words):
ttext = text.strip()
sw_buf = [] #敏感词
for sw in sens_words:
n = ttext.count(sw) #敏感词出现次数
if n>0:
sw_buf.append([sw,n])
return sw_buf

#去除常用词
def remove_stop_words(text, stop_words):
#保存过滤词数量的字典
swords_cnt = {}

while " " in text: #去掉多余空格

text = text.replace(' ', ' ')
for key, words in stop_words.items():
swords_cnt[key] = np.zeros(len(words)) #创建向量
for i,stpwd in enumerate(words):
if (stpwd) in text:
text = text.replace(' '+stpwd+' ', ' ')
# swords_cnt[key][i] += text.count(stpwd)
swords_cnt[key][i] += 1
return text, swords_cnt

#创建词云
def create_word_cloud(text, max_words, img_path=None):
wc = WordCloud(
font_path="./simhei.ttf",
max_words=max_words,
width=max_words*4,
height=max_words*4,
)
wordcloud = wc.generate(text)
#写词云图片
if img_path is not None:
wordcloud.to_file(img_path)
return wordcloud/<code>

读取过滤词和敏感词

设置一些路径和全局字典.这里要提醒大家,使用的是jupyter做数据分析这种临时的项目可以这么玩.如果是正经的项目或者工程开发.千万要写配置文件进参数配置,而不是写死在代码里.否则你会被同事和老板diss的.

<code>#读取过滤词和敏感词
stop_words_path = 'stop_words.txt'
bodypart_words_path = "stop_words_bodypart.txt"
color_words_path = "stop_words_color.txt"
motion_words_path = "stop_words_motion.txt"
orientation_words_path = "stop_words_orientation.txt"
role_name_words_path = "stop_words_role_name.txt"
site_words_path = "stop_words_site.txt"
thing_words_path = "stop_words_ting.txt"
title_words_path = "stop_words_title.txt"

stop_words = {}
stop_words["default"] = read_words_list(stop_words_path)
stop_words["bodypart"] = read_words_list(bodypart_words_path)
stop_words["color"] = read_words_list(color_words_path)
stop_words["motion"] = read_words_list(motion_words_path)
stop_words["orientation"] = read_words_list(orientation_words_path)
stop_words["role_name"] = read_words_list(role_name_words_path)
stop_words["site"] = read_words_list(site_words_path)
stop_words["thing"] = read_words_list(thing_words_path)
stop_words["title"] = read_words_list(title_words_path)

sens_words_path = 'sensitive_words.txt'
sens_words = read_words_list(sens_words_path)/<code>

数据分析函数

主要就是用正则表达式去除特殊标点,另外jieba分词也是在这里使用的

<code>#文本分析
def analyze_text(text):
#去标点符号
article_str = re.sub(r"[0-9\\s+\\.\\!\\/_,$%^*()?;;:-【】+\"\\']+|[+——!,;::。?、~@#¥%……&*()]+", " ", text)

#整理词云
article_str = " ".join(jieba.cut(article_str,cut_all=False, HMM=True))
#记总数
article_str_cnt = len(article_str.split())
#检查敏感词
sub_sens_word_buf = check_sens_words(article_str, sens_words)

#去除过滤词
article_str, s_cnt = remove_stop_words(article_str, stop_words)

return article_str, article_str_cnt, s_cnt, sub_sens_word_buf/<code>

配置AO3的文章分析

这里还是使用BeautifulSoup进行分析。我希望通过相应html标签找到:

  • 分级文本(rating)
  • 点击量(hits)
  • 发布日期(published)
  • 正文(article)

本来还想提取主角信息来方面滤掉主角名称。但是发现主角名似乎是js代码获取,并不好获取,就放弃了。为了方便文章分析,用正则表达式吧有标点都替换成空格,并把正文中的 p 标签和 br 标签都替换为空格。后期在做NLP提取句子的时候,这里有改动.增加了获取的信息并且用标点预分割出句子.等写到那里的时候再跟大家说明,这里Mark一下.

<code>base_path = "fulltext/"
ao3_pbar = tqdm(os.listdir(base_path))/<code>


<code>#提取ao3文章
def extract_ao3_work(html, stop_words, sens_words):
soup = BeautifulSoup(html, 'html.parser')
#提取分级标签
rating_dd = soup.find('dd', attrs={'class': 'rating tags'}) #找到分级标签
rating_a = rating_dd.find('a', attrs={'class': 'tag'}) #找到对应的a标签
rating = rating_a.string #获得标签文字

stats_dd = soup.find('dl', attrs={'class': 'stats'})
#提取点击量
hits_dd = stats_dd.find('dd', attrs={'class': 'hits'}) #找到分级标签
try:
hits = int(hits_dd.string)
except AttributeError:
hits = 0


#提取发布日期
published_dd = stats_dd.find('dd', attrs={'class': 'published'}) #找到分级标签
date_str = published_dd.string

#提取文章
article_div = soup.find('div', attrs={'role': 'article'}) #找到文章标签
article_userstuff = article_div.find('div', attrs={'class': 'userstuff'})
article_str = str(article_userstuff)
article_str = article_str.replace("
","")
article_str = article_str.replace("

","")
article_str = article_str.replace("
","")
article_str = article_str.replace("

"," ")
article_str = article_str.replace(""," ")
article_str = article_str.replace(" "," ")
article_str = article_str.replace("
"," ")

# print(article_str)
# time.sleep(3)
return rating, hits, date_str, article_str/<code>

在运行迭代前还要配置一些全局变量存储需要分析的信息,还是那句老话,正经项目注意规范,不要这么干!

普及一下:首先如果公司或者参与的项目有相关的指导和规范就按照指导规范来.

如果没有,尽量遵循以下原则:

  • 死数字尽量改为常量或宏(Python 没有宏)并注意命名区分(通常是全大写);
  • 常量尽可能通过配置文件传入;
  • 尽量少用全局变量,使用类(class)把方法和变量封装在一起;
  • 全局变量命名也需要区分(通常是全大写);

在 python 语法里 命名前面加"_"才是局部变量,通常创建的都是全局变量,而大家一般没这个书写习惯,特别是在使用 Jupyter 时,如果不 Restart 很容易混淆,需要特别注意.

<code>all_article_str = "" #所有文字
all_article_str_cnt = 0
sens_word_str = "" #包含的所有敏感词
rating_article_dict = {} #按照分级保存的文字
rating_sens_word_dict = {} #按照分级保存的包含敏感词
stop_cnt = {} #过滤词的计数
for key, words in stop_words.items():
stop_cnt[key] = np.zeros(len(words)) #创建向量
date_cnt_dict = {} #发表时间字典,按月统计/<code>

对AO3文章进行拆分处理

这里开始对文章进行依次处理.获取后面生成图表所需要的数据.具体步骤代码中都有注释,操作也比较简单,各位自己看吧.

对于 python 的初学者啰嗦两句:

  1. 认真学习 for 循环的精髓,善用 enumerate zip 等方法, range效率低且low;
  2. 善用字典和列表.列表和numpy的切片功能要掌握清楚,如果从C++等语言转过来,你就知道Python这些功能真的是神方便;
  3. 分清软拷贝和硬拷贝,不论那种语言这个都很重要.
<code>for work in ao3_pbar:
work_path = os.path.join(base_path,work)
with open(work_path) as f:
work_str = f.read() #读取文章
rating, hits, date_str, article_str = extract_ao3_work(work_str, stop_words, sens_words)
article_str, artstr_cnt, sub_stop_cnt, sub_sens_word_buf = analyze_text(article_str)
all_article_str += article_str #所有文章文字融合
all_article_str_cnt += artstr_cnt #所有词语数量加和

#统计日期2020-01-01,按月
date_elem = date_str.split("-")
month_date = date_elem[0]+"-"+date_elem[1]
if not date_cnt_dict.__contains__(month_date): #不存在分级则创建一个
date_cnt_dict[month_date] = 0
date_cnt_dict[month_date] += 1

#为每个过滤词添加计数
for sc, sub_sc in zip(stop_cnt.values(), sub_stop_cnt.values()):
sc += sub_sc

#所有敏感词融合
for swlist in sub_sens_word_buf:
for s in range(swlist[1]):
sens_word_str += swlist[0] + " "

#按标签分类文章
if not rating_article_dict.__contains__(rating): #不存在分级则创建一个
# 文本,总词数,文章数,总点击量,无敏感词文章数
rating_article_dict[rating] = ["",0,0,0,0]

# 敏感词集合,总敏感词数
rating_sens_word_dict[rating] = ["",0]

rating_article_dict[rating][0] += article_str + " "
rating_article_dict[rating][1] += artstr_cnt
rating_article_dict[rating][2] += 1
rating_article_dict[rating][3] += hits

sens_word_cnt = 0 #敏感词计数
for swlist in sub_sens_word_buf:
for s in range(swlist[1]): #敏感词重复也计入
rating_sens_word_dict[rating][0] += swlist[0] + " "
rating_sens_word_dict[rating][1] += 1
sens_word_cnt += 1

#敏感词小于一定数量
if sens_word_cnt < 5:
rating_article_dict[rating][4] += 1/<code>

分级标签占比

AO3总体中文文章比例:大众向2万8千篇;青少2万4千篇;成人8万1千篇;激烈4万8千篇;未分级6万3千篇。对比抽取样本的比例和总体比例,样本分布还是基本满足均匀分布的。

截止发文时间,AO3有共有中文文章:244595篇,抽取中文文章数量:12066篇

详细的内容说明大家去看我的头条文章或者豆酱的知乎文章即可,我就不复述了.

代码详解: 在jupyter 中使用 plt 绘制图片时经常遇到图太小的问题.可以使用: plt.figure(figsize=(15,15)) 解决.这里使用 饼图 pie 来绘制,这个图表比较简单,就没有做复杂的标签.一些复杂操作,后面的图我会分别和大家介绍.

<code>#分级标签
tags = [k for k in rating_article_dict.keys()]
#数值:文章数 2
values = [v[2] for v in rating_article_dict.values()]

#绘制饼图
plt.figure(figsize=(15,15))
plt.pie(x=values, labels=tags)
plt.show()

for t,v in zip(tags, values):
print(t+" "+str(v*100.0/np.sum(values))+"%")/<code>


我是怎么分析一万篇AO3文章的

写作时间统计

我将中文文章写作时间按月统计,注意这个曲线是当月发布的数量,而不是累加值.

这里在之前的爬虫实践中有个风险.由于爬虫使用了 AO3 的搜索引擎,无法确保AO3是否使用了搜索优化算法来影响结果,造成偏差.如果有,那么最容易受影响的就是时间统计. 解决这个问题的方法也比较简单.使用 numpy 的 shuffle 打乱页码基本就可以避免这个问题.

首先获取当前时间的年月,并且去掉,因为本月没有过完,不能反应全月的数字.因为文章统计使用字典保存的,去除当前月的操作相当简单.文章的写作时间是离散的,并且月份是12进制,所以进行统计时,将年份作为整数,月份除以12作为小数部分作为统计即可.最后要注意按照时间顺序使用 np.argsort (输出的是下标顺序) 进行排序,否则折线图是乱的.

<code>#时间标签处理
#删掉当前月份发布的文章以免影响趋势判断
mounth_now = time.strftime('%Y-%m',time.localtime(time.time()))
if rating_article_dict.__contains__(mounth_now):
print("Contain: "+mounth_now)
rating_article_dict.pop(mounth_now)
else:
print(mounth_now+" Not Contained ")
times = []
conts = []

for k,v in date_cnt_dict.items():
k_elem = k.split("-")
times.append(float(k_elem[0])+float(k_elem[1])/12)
conts.append(v)

sorted_times = []
sorted_conts = []
sortindex = np.argsort(times)
for i in range(len(times)):
sorted_times.append(times[sortindex[i]])
sorted_conts.append(conts[sortindex[i]])

plt.figure(figsize=(15,15))
plt.plot(sorted_times, sorted_conts)
plt.show()/<code>


我是怎么分析一万篇AO3文章的

无敏感词文章统计

这张图绘制的元素是比较多的.可以重点注意一下每个条形图上的数字标签是如何生成的. 另外就是图例函数 plt.legend 中 loc=2 表示 左上角. best (0) 会在右上角遮住 Mature 的条形图.

这里的小 Tip 是关于字符串的格式化输出,一般有3种: .format 百分号% 和 str()函数直接加.我一般用第一种和最后一种,看大家的喜好了.

<code>#分级标签
tags = [k for k in rating_article_dict.keys()]
#数值:文章数 2 无敏感词文章数 4
values0 = [v[4] for v in rating_article_dict.values()]
values1 = [v[2] for v in rating_article_dict.values()]

#画条形图
x = np.arange(len(tags))
bar_width = 0.3

plt.figure(figsize=(15,15))
plt.xticks(fontsize=18,rotation=-45)
plt.yticks(fontsize=30)
a = plt.bar(x, values0, 0.4, color='dodgerblue', label='无敏感词文章数', align='center')
b = plt.bar(x + bar_width, values1, 0.4, color='orangered', label='总文章数', align='center')
# 设置标签
for i,j in zip(a,b):
ih = i.get_height()
jh = j.get_height()
plt.text(i.get_x()+i.get_width()/3, ih, '{}|{:.3}%'.format(int(ih),float(ih)*100/float(jh)), ha='center', va='bottom')
plt.text(j.get_x()+j.get_width()/2, jh, '{}'.format(int(jh)), ha='center', va='bottom')

plt.xticks(x,tags)
plt.legend(loc=2)
plt.show()/<code>


我是怎么分析一万篇AO3文章的

敏感词数量的分布

敏感词分布绘图没什么好说的,这里被大家指出敏感词库有一些问题,后来经过我手工挑选做了一个新的敏感词库.并且包含了英文敏感词.已经上传到Github上,大家可以去下载.不怕瞎的可以阅读一下.

暴力次品统计也是被大家诟病比较多的一个点.虽然我在文章中也提示了,但是按时引起了争议.因此后续我改用了深度神经网络训练了一个NLP文本分类器专门鉴别

敏感句.并且把句子都摘出来做成了视频.知乎不能上传,有兴趣的小伙伴可以到 B站 或者 头条 去看.

<code>#分级标签
tags = [k for k in rating_article_dict.keys()]
tags.append("All")
#数值:敏感词数 除以 总词数
values = [v[1]/s[1] for v,s in zip(rating_sens_word_dict.values(), rating_article_dict.values())]
values.append(len(sens_word_str.split())/all_article_str_cnt)
#画条形图
plt.figure(figsize=(15,15))
plt.xticks(fontsize=18,rotation=-45)
plt.yticks(fontsize=30)
plt.bar(tags, values)
for a,b in zip(tags, values):
plt.text(a, b+0.0001, '{:.3}%'.format(b*100), ha='center', va='bottom')/<code>


我是怎么分析一万篇AO3文章的

创建并显示词云

词云显示这里比较出彩的就是敏感字替换了,先前我自己写代码时,词云已经被我替换的面目全非了.但是豆酱提出这样不能够对大家造成冲击,于是直接使用拼音首字母替换了.其中一个有趣的工作就是用 utf8 编码对很H的字进行替换.大家可以自己看看被 utf8 遮住的是什么字.

<code>def harm_text(text, ignore=False):
if ignore:
return text
hrmonious = {}
#不需要请注释下方
hrmonious['\\\\\\u5988'.encode('utf-8').decode('unicode_escape')] = 'M'
hrmonious['\\\\\\u5c04'.encode('utf-8').decode('unicode_escape')] = 'S'
hrmonious['\\\\\\u5a4a'.encode('utf-8').decode('unicode_escape')] = 'B'
hrmonious['\\\\\\u75f4'.encode('utf-8').decode('unicode_escape')] = 'C'
hrmonious['\\\\\\u4e73'.encode('utf-8').decode('unicode_escape')] = 'R'
hrmonious['\\\\\\u5978'.encode('utf-8').decode('unicode_escape')] = 'J'
hrmonious['\\\\\\u6027'.encode('utf-8').decode('unicode_escape')] = 'X'
hrmonious['\\\\\\u88f8'.encode('utf-8').decode('unicode_escape')] = 'L'
hrmonious['阴'] = 'Y'
hrmonious['\\\\\\u7a74'.encode('utf-8').decode('unicode_escape')] = 'X'
hrmonious['\\\\\\u8361'.encode('utf-8').decode('unicode_escape')] = 'D'
hrmonious['鸡'] = 'J'
hrmonious['\\\\\\u830e'.encode('utf-8').decode('unicode_escape')] = 'J'
hrmonious['\\\\\\u6deb'.encode('utf-8').decode('unicode_escape')] = 'Y'
hrmonious['\\\\\\u6170'.encode('utf-8').decode('unicode_escape')] = 'W'
hrmonious['高'] = 'H'
hrmonious['爱'] = 'A'
hrmonious['头'] = 'T'
hrmonious['内'] = 'N'
hrmonious['插'] = 'C'
hrmonious['情'] = 'Q'
hrmonious['春'] = 'C'
hrmonious['\\\\\\u9f9f'.encode('utf-8').decode('unicode_escape')] = 'G'
hrmonious['脱'] = 'T'
hrmonious['教'] = 'J'
hrmonious['做'] = 'D'

hrmonious['阳'] = 'Y'
hrmonious['潮'] = 'C'
hrmonious['呻'] = 'S'
hrmonious['摩'] = 'M'
hrmonious['交'] = 'J'
hrmonious['下'] = 'X'
hrmonious['抽'] = 'C'
hrmonious['感'] = 'G'
hrmonious['色'] = 'C'
hrmonious['液'] = 'Y'
hrmonious['调'] = 'T'
hrmonious['水'] = 'S'
hrmonious['按'] = 'A'
hrmonious['道'] = 'D'
hrmonious['叫'] = 'J'
hrmonious['激'] = 'J'
hrmonious['\\\\\\u68d2'.encode('utf-8').decode('unicode_escape')] = 'B'
hrmonious['体'] = 'T'
hrmonious['嫩'] = 'N'
hrmonious['肉'] = 'R'
hrmonious['丝'] = 'S'
hrmonious['吟'] = 'Y'
hrmonious['庭'] = 'T'
hrmonious['奶'] = 'N'
hrmonious['屁'] = 'P'
#不需要请注释上方

for k,v in hrmonious.items():
text = text.replace(k,v)
return text

def code_utf8(dic):
for key in dic.keys():
uc = key.encode('unicode_escape').decode('utf-8')
print(key + " || " + uc + " || " + uc.encode('utf-8').decode('unicode_escape'))

#code_utf8(hrmonious)/<code>


<code>print("#创建文章所有词云")
all_wc = create_word_cloud(harm_text(all_article_str), 500) #"wordcloud.jpg"
plt.figure(figsize=(15,15))
plt.imshow(all_wc)
plt.axis("off")

plt.title("文章所有词语的词云")
plt.show()
print("#创建文章所有敏感词的词云")
sens_wc = create_word_cloud(harm_text(sens_word_str),100) #"sens_wordcloud.jpg"
plt.figure(figsize=(15,15))
plt.imshow(sens_wc)
plt.axis("off")
plt.title("文章敏感的词云")
plt.show()
print("#创建分级文章所有词云")
for k, word in rating_article_dict.items():
r_all_wc = create_word_cloud(harm_text(word[0]), 500) #k+"_wordcloud.jpg"
plt.figure(figsize=(15,15))
plt.imshow(r_all_wc)
plt.axis("off")
plt.title(k+" 的词云")
plt.show()
print("#创建分级文章敏感词的词云")
for k, sens in rating_sens_word_dict.items():
r_sens_wc = create_word_cloud(harm_text(sens[0]), 100) #k+"_sens_wordcloud.jpg"
plt.figure(figsize=(15,15))
plt.imshow(r_sens_wc)
plt.axis("off")
plt.title(k+" 的敏感词的词云")
plt.show()/<code>

这里只放一张图


我是怎么分析一万篇AO3文章的

点击率对比

剩下的基本都是重复工作了,我就不再赘述,这里就贴两个代码和图了事.

<code>#分级标签
tags = [k for k in rating_article_dict.keys()]
#数值:文章数 2 总点击量 3
values = [v[3]/v[2] for v in rating_article_dict.values()]

#画条形图
plt.figure(figsize=(15,15))
plt.xticks(fontsize=18,rotation=-45)
plt.yticks(fontsize=30)
plt.bar(tags, values)
# for a,b in zip(tags, values):
# plt.text(a, b+0.0001, '{:.3}%'.format(b*100), ha='center', va='bottom')/<code>


我是怎么分析一万篇AO3文章的

主角统计

平台喜欢的主角名称,只取了排名Top30。

<code>#拆分数据
keys = list(stop_words['role_name'])
values = list(stop_cnt['role_name'])

#数据过多取排名靠前的数据
sub_keys = []
sub_values = []
sortindex = np.argsort(values)[::-1][:30]
for i in sortindex:
sub_keys.append(keys[i])
sub_values.append(values[i])

#画条形图
plt.figure(figsize=(15,15))
plt.xticks(fontsize=13,rotation=-70)
plt.yticks(fontsize=20)
plt.bar(sub_keys, sub_values)/<code>


我是怎么分析一万篇AO3文章的

横向对比

最后的横向对比实际就是拿了 《羊脂球》、《百年孤独》、《红楼梦》、《金瓶梅》 四篇文章进行一个对照.这里代码就是把前面的东西再跑一遍.只是点击率,日期是无法统计的,分级标签替换为书名,书的内容不需要html处理。其余数据分析与上面一致。我就不再说明了.

我主要阐述一下这里的问题:

4篇文章对比1万2千多篇文章是没有太大对比性的.很多小伙伴都提出了这个问题.这个也是文中最大的逻辑Bug.解决方案很简单.取国内合规网文或同人文的语料,规模大致与这个1万2千篇规模相当.按照上面的步骤跑一遍即可.我在文章中也有提到过四篇对比就是一个抛砖引玉的工作.

这个事情在当时,不论做不做都对文章结论影响不大所以就没做大规模对比了.结果没想到居然还被揪出来diss.再加上后来豆酱又15天不能说话.索性就把.NLP 句子识别做出来了.而且是弄了600篇直接把检测句子贴出来.因为我们发现真的很少人去仔细看文.就是欺负大家看不到AO3的内容.

视频在 B站 和 头条西瓜 上都有.那个数据的代码和技术分析我也会陆续发出来.(上班周更党大家理解下)(PS:我上周就把深度学习的代码push上去了,结果今天写文检查代码库的时候发现上传错了,把珍藏的杀手锏搞上去了,不过估计也用不上了,我也不会撤掉,是啥大家自己去看吧.视频相关的代码我会在明天再整理一下上传)



写在最后

实际上我并不是从事数据分析专业工作的,做这些完全是正好想学习+玩,又正好碰上豆酱关注这个事情.不论227对大家有什么影响,反正对我是受益良多的.

我也希望我能引起小伙伴们的兴趣,一起加入学习探索.实际上编程开发的乐趣是一个创造和探索的乐趣.这与这个纷纷扰扰的社交世界是完全不同的体验.也希望我做的工作除了引发更多口水外也能真正帮助到大家.


分享到:


相關文章: