review.py

#!/usr/bin/env python3
import arxiv
import argparse
import json
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from collections import Counter

def main():
    parser = argparse.ArgumentParser(description="Literature review automation")
    parser.add_argument("topic", help="Research topic")
    parser.add_argument("--years", help="Year range (e.g., 2020-2024)")
    parser.add_argument("--max-papers", type=int, default=50, help="Maximum number of papers")
    args = parser.parse_args()

    # 下载 NLTK 数据
    nltk.download('punkt', quiet=True)
    nltk.download('stopwords', quiet=True)

    # 构建搜索查询
    search_query = args.topic
    if args.years:
        start_year, end_year = args.years.split('-')
        search_query = f"{search_query} AND submittedDate:[{start_year}0101 TO {end_year}1231]"

    # 搜索论文
    search = arxiv.Search(
        query=search_query,
        max_results=args.max_papers,
        sort_by=arxiv.SortCriterion.SubmittedDate
    )

    # 分析论文
    papers = []
    all_words = []
    stop_words = set(stopwords.words('english'))

    for result in search.results():
        paper = {
            "id": result.get_short_id(),
            "title": result.title,
            "authors": [str(author) for author in result.authors],
            "summary": result.summary,
            "published": result.published.isoformat(),
            "pdf_url": result.pdf_url,
            "categories": result.categories
        }
        papers.append(paper)

        # 收集关键词
        text = f"{result.title} {result.summary}"
        words = word_tokenize(text.lower())
        words = [word for word in words if word.isalpha() and word not in stop_words]
        all_words.extend(words)

    # 计算关键词频率
    word_counts = Counter(all_words)
    top_keywords = word_counts.most_common(20)

    # 输出结果
    output = {
        "topic": args.topic,
        "years": args.years,
        "total_papers": len(papers),
        "top_keywords": [{"word": word, "count": count} for word, count in top_keywords],
        "papers": papers
    }

    print(json.dumps(output, indent=2))

if __name__ == "__main__":
    main()