Acl论文集检索下载小助手

工欲善其事,必先利其器,最近要写survey,想看下顶会里面关于某个特定话题的论文,因此顺手写了一个acl-anthology-helper,希望能对大家有所帮助。
acl-anthology-helper的主要目的是快速地从'acl anthology' (ACL Anthology - ACL Anthology)官网上下载指定论文集中包含某些关键词的论文.
主要功能
检索acl anthology 官网中收录的论文。 直接从网上检索. e.g. Retriever.acl(2021, ConfConsts.LONG) 将论文保存到本地数据库中(MySQL). e.g.db = AnthologyMySQL(cache_enable=True)db.create_tables()db.load_data() # 将数据爬取载入数据库中引入ABuilder 以支持对MySQL 的链式操作。 e.g.data = ABuilder().table('paper').where({"year": ["in", years_limit]}).where({"venue": ["in", venue_limit]}).query()通过关键词对论文进行过滤。 e.g. filtered = papers.filter('title', 'xxx') | papers.filter('abstract', 'xxx') e.g. filtered = papers.and_containing_filter(attr, [keyword1, keyword2])下载所需要的论文。 e.g. downloader.multi_download(filtered, download_path)本地缓存。日志打印。信息采集。
快速开始
下载代码,打开终端切换至代码的根目录。 运行
pip install requirements.txt
cd tasks
python basic_task.py
basic_task.py的代码:
import os
from ABuilder.ABuilder import ABuilder
from src.modules.downloader import PaperDownloader
from src.modules.papers import Paper, PaperList
from src.modules.anthology_mysql import AnthologyMySQL
from src.common.database_tools import MySQLTools
class BasicTask(object):
@classmethod
def load_data_to_db(cls):
"""
将论文数据载入数据库
"""
db = AnthologyMySQL(cache_enable=True)
db.create_tables()
db.load_data() # 将数据爬取载入数据库中
@classmethod
def query_papers(cls, keyword: str, conf_contents: list):
"""
检索论文
"""
years_limit = tuple(range(2016, 2022))
data = ABuilder().table('paper') \
.where({"year": ["in", years_limit]}) \
.where({"venue": ["in", conf_contents]}).query()
papers = MySQLTools.list_to_papers(data)
filtered = papers.containing_filter('title', keyword) | papers.containing_filter('abstract', keyword)
return filtered
@classmethod
def download_papers(cls, papers: PaperList, keyword, conf_content):
"""
检索论文
"""
downloader = PaperDownloader()
downloader.multi_download(papers, os.path.join(keyword, conf_content))
@classmethod
def run(cls):
cls.load_data_to_db()
downloader = PaperDownloader()
conf_contents_limit = ['ACL', 'EMNLP', 'TACL', 'NAACL']
while True:
keyword = input('\ntype a keyword(blank will exit): ')
if not keyword.strip():
break
papers = cls.query_papers(keyword, conf_contents_limit)
print(f'The size of papers: {papers.size}')
group = papers.group('conf_content')
for conf_content, papers_obj in group.items():
downloader.multi_download(papers_obj, os.path.join(keyword, conf_content))
if __name__ == '__main__':
BasicTask.run()
提示
该项目用 Python 3.6 所写, 不支持 Python 2。
ACL Anthology官网
可以看到有很多论文集。
打开其中一个可以看到论文列表。