任务3:论文代码统计(使用正则表达式)

3.1 任务说明

  • 任务主题:论文代码统计,统计所有论文出现代码的相关统计;
  • 任务内容:使用正则表达式统计代码连接、页数和图表数据;
  • 任务成果:学习正则表达式统计;

参考链接:https://github.com/datawhalechina/team-learning-data-mining/blob/master/AcademicTrends/Task3%20%E8%AE%BA%E6%96%87%E4%BB%A3%E7%A0%81%E7%BB%9F%E8%AE%A1.md

3.2 数据处理步骤

在原始arxiv数据集中作者经常会在论文的comments或abstract字段中给出具体的代码链接,所以我们需要从这些字段里面找出代码的链接。

  • 确定数据出现的位置;
  • 使用正则表达式完成匹配;
  • 完成相关的统计;

3.3 正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

3.3.1普通字符

大写字母和小写字母,所有数字、所有标点符号和一些其他符号

字符 描述
[ABC] 匹配 […] 中的所有字符,例如 [aeiou] 匹配字符串 “google runoob taobao” 中所有的 i e o u a 字母。
[^ABC] 匹配除了 […] 中字符的所有字符,例如 [^aeiou] 匹配字符串 “google runoob taobao” 中除了 e o u a 字母的所有字母。
[A-Z] [A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示匹配所有的小写字母。
. 匹配出了换行符(\n,\r)以外的任何单个字符,相当于[^\n\r]
[\s\S] 匹配所有字符。\s是匹配所有空白符,包括换行,\S是匹配非空白符,包括换行
\w 匹配字母、数字、下划线。等价于[A-Za-z0-9]

3.3.2 有特殊含义的字符

特别字符 描述
() 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用(和)。
* 匹配前面的子表达式零次或多次。要匹配字符,请使用
+ 匹配前面的子表达式一次或多次。要匹配+字符,请使用+。
. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 . 。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 [。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\’ 匹配 “”,而 ‘(’ 则匹配 “(”。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 ^。
{ 标记限定符表达式的开始。要匹配 {,请使用 {。
\ 指明两项之间的一个选择。要匹配\ ,请使用 \。

3.3.3 限定符

字符 描述
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 、 “does” 中的 “does” 、 “doxy” 中的 “do” 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。

3.4代码操作

#导入所需的package并读取原始数据
import seaborn as sns
from bs4 import BeautifulSoup   # 用于爬取arxiv的数据
import re
import requests   # 用于向网络发送请求
import json
import pandas as pd  # 数据处理和分析
import matplotlib.pyplot as plt  # 画图工具
data = []
with open('arxiv-metadata-oai-snapshot.json','r') as f:
    for idx, line in enumerate(f):
        d = json.loads(line)
        d = {'abstract':d['abstract'],'categories':d['categories'],'comments':d['comments']}
        data.append(d)
        
data = pd.DataFrame(data)

data.head()
image.png
data['categories']
image.png
data['abstract'][1]
image.png

从获取的信息可以看出comments里面包含pages和figures信息

3.4.1 对pages进行抽取

# 使用正则表达式进行匹配, xx pages
data['pages'] = data['comments'].apply(lambda x: re.findall('[1-9][0-9]* pages', str(x)))
data['pages'].head()
image.png
# 筛选出有pages的论文
data = data[data['pages'].apply(len)>0]
data
image.png
# 由于匹配得到的是一个list,如['19 pages'],需要进行转换
data['pages']=data['pages'].apply(lambda x: float(x[0].replace('pages','')))
data['pages']
image.png
# 对pages进行统计
data['pages'].describe().astype(int)
image.png

统计结果如下:论文平均的页数为17页,75%的论文在22页以内,最长的论文有11232页。
接下来按照分类统计论文页数,选取了论文的第一个类别的主要类别:

# 选择主要类别
data['categories'] = data['categories'].apply(lambda x: x.split(' ')[0])
data['categories']
image.png
# 只取.前面的字符串
data['categories'] = data['categories'].apply(lambda x: x.split('.')[0])
data['categories']
image.png
# 每一类论文的平均页数

plt.figure(figsize=(12, 6))
data.groupby(['categories'])['pages'].mean().plot(kind='bar')
image.png
# 每一类论文的总页数

plt.figure(figsize=(12, 6))
data.groupby(['categories'])['pages'].sum().plot(kind='bar')
image.png

3.4.2 抽取论文图表个数

figures和pages的获取思路一致,都是在comments列下进行:正则》获取有效的行》获取实际的数值

data['figures'] = data['comments'].apply(lambda x: re.findall('[1-9][0-9]* figures', str(x)))
data = data[data['figures'].apply(len) > 0]
data['figures'] = data['figures'].apply(lambda x: float(x[0].replace('figures','')))
data.head()
image.png
# 按照论文类别进行统计

plt.figure(figsize=(12, 6))
data.groupby(['categories'])['figures'].mean().plot(kind='bar')
image.png

3.4.3 抽取论文的代码链接

论文代码存在于comments或abstract之中,网址中通常包含'github'字符

# 筛选包含github的论文

data_with_code = data[(data.comments.str.contains('github')==True)|(data.abstract.str.contains('github')==True)]
data_with_code['text']=data_with_code['abstract'].fillna('')+data_with_code['comments'].fillna('')
data_with_code['text']
image.png
data_with_code['text'][253172]
image.png

阅读上面的文本后发现论文代码网址:http://nbarbey.github.com/TomograPy/

# 使用正则表达式匹配论文

patten = '[a-zA-Z]+://github[^\s]*'
data_with_code['code_flag'] = data_with_code['text'].str.findall(patten).apply(len)
data_with_code['code_flag']
image.png
data_with_code['text'][254226]
image.png
data_with_code['text'][300298]
image.png

从上面的分析中可以看出按照正则表达式的要求:有效网址如下:https://github.com/dcasadei/psde
虽然统计结果为2,但是两个是相同的网址

data_with_code=data_with_code[data_with_code['code_flag']==1]
data_with_code
image.png
# 可视化:按照论文类别统计code代码个数

plt.figure(figsize=(12,6))
data_with_code.groupby(['categories'])['code_flag'].count().plot(kind='bar')
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • 任务1:论文数据统计 1.1 任务说明[https://github.com/datawhalechina/tea...
    希娅_d503阅读 137评论 0 0
  • 夜莺2517阅读 127,665评论 1 9
  • 版本:ios 1.2.1 亮点: 1.app角标可以实时更新天气温度或选择空气质量,建议处女座就不要选了,不然老想...
    我就是沉沉阅读 6,802评论 1 6
  • 我是一名过去式的高三狗,很可悲,在这三年里我没有恋爱,看着同龄的小伙伴们一对儿一对儿的,我的心不好受。怎么说呢,高...
    小娘纸阅读 3,345评论 4 7
  • 那一年,我选择了独立远行,火车带着我在前进的轨道上爬行了超过23个小时; 那一年,我走过泥泞的柏油路,在那个远离故...
    木芽阅读 1,604评论 4 5