1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
from bs4 import BeautifulSoup as bs
from datetime import datetime
import urllib.request
import re
from dateutil.rrule import rrule, MONTHLY
import numpy as np
from random import randint
from flask import Flask, abort, render_template
from functools import cache
import feedparser
parse = lambda l: bs(urllib.request.urlopen(l), 'html.parser')
@cache
def total(l):
r = re.search('total of ([0-9]*)', parse(l).find('small').text)
if r is None:
return 0
return int(r.group(1))
@cache
def get_links(category="cs"):
link = ("https://export.arxiv.org/list/"+category+"/{}{}").format
first = parse(link('00','00'))
start = datetime.strptime(first.find('a', href=re.compile('/list/'+category+'/[0-9]{4}')).text, '%y%m')
return [link(t.strftime('%y'),t.strftime('%m')) for t in rrule(MONTHLY, dtstart=start, until=datetime.now())]
@cache
def get_probability_distribution(topic):
links = get_links(topic)
x = [0, len(links)//2, len(links)-2]
#n = 2
#x = [x * (len(links)-1) // n for x in range(n + 1)]
y = [total(links[x]) for x in x]
c = np.polyfit(x, y, 3)
eq = np.poly1d(c)
lengths = np.vectorize(eq)(range(len(links)))
lengths[-1] = total(links[-1]) # account for current month having few submissions
#lengths = np.array([c[0] * x**2 + c[1] * x + c[2] for x in range(len(links))])
return lengths / sum(lengths)
taxonomy = ['cs', 'econ', 'eess', 'math', 'astro-ph', 'cond-mat', 'gr-qc', 'hep-ex', 'hep-lat', 'hep-ph', 'hep-th', 'math-ph', 'nlin', 'nucl-ex', 'nucl-th', 'physics', 'quant-ph', 'q-bio', 'q-fin', 'stat']
app = Flask(__name__)
@app.route('/favicon.ico')
def favicon():
return abort(404)
@app.route('/<topic>', methods=['GET'])
def random(topic):
l = get_links(topic)
p = get_probability_distribution(topic)
d = np.random.choice(l, p=p)
paper = parse(d+f'?skip={randint(0,total(d)-1)}&show=5').find('a', title="Abstract").text[6:]
link = 'https://arxiv.org/abs/'+paper
feed = feedparser.parse(f'http://export.arxiv.org/api/query?id_list={paper}')
entry = feed['entries'][0]
return render_template('topic.html', description=entry['description'], title=entry['title'], link=link)
@app.route('/')
def index():
return render_template('index.html', taxonomy=taxonomy)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
|