工欲善其事,必先利其器,最近要写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官网
可以看到有很多论文集。
打开其中一个可以看到论文列表。