You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术需求:统计5个PDF文件中作者合作对的出现次数

解决思路与实现步骤

1. 提取PDF中的有效作者信息

  • 批量从5个PDF中提取每篇文档的作者列表,重点处理格式差异(如全称/缩写、不同分隔符),只保留给定700位作者列表内的人员
    • 工具选型:用pdfplumber或PyPDF2提取可编辑PDF文本;若为扫描件,搭配pytesseract做OCR识别
    • 关键操作:将提取到的作者名与有效列表做精确匹配,排除无关人员,同时去重同一文档内的重复作者

2. 生成作者合作组合

  • 针对每篇PDF的有效作者列表,生成所有2人及以上的无序合作组合(如A&B与B&A视为同一组合)
    • 实现方式:用Python的itertools.combinations函数,遍历从2到当前文档作者数的所有长度,生成对应组合后排序,保证组合一致性

3. 统计组合出现次数

  • 用collections.Counter统计每个组合在所有PDF中的出现次数,注意同一篇PDF内的同一组合仅计数一次

代码示例

import pdfplumber
from itertools import combinations
from collections import Counter
import re

# 加载700位作者列表(假设为每行一个作者的txt文件)
with open('authors_list.txt', 'r', encoding='utf-8') as f:
    valid_authors = set(line.strip() for line in f if line.strip())

# 初始化组合计数器
combination_counter = Counter()

# 遍历目标PDF文件
pdf_files = ['doc1.pdf', 'doc2.pdf', 'doc3.pdf', 'doc4.pdf', 'doc5.pdf']
for pdf_path in pdf_files:
    with pdfplumber.open(pdf_path) as pdf:
        # 提取首页文本(作者通常位于首页,可按需调整页码范围)
        first_page = pdf.pages[0]
        text = first_page.extract_text()
        
        # 匹配作者区域(需根据实际PDF格式调整正则规则)
        author_match = re.search(r'(Authors?:|Author?:)\s*(.*?)(?=\n[A-Z]|$)', text, re.DOTALL)
        if author_match:
            authors_text = author_match.group(2)
            # 分割作者,兼容逗号、换行、and等分隔符
            extracted_authors = re.split(r',|\n|and|&', authors_text)
            # 清洗并筛选有效作者
            current_authors = []
            for auth in extracted_authors:
                auth_clean = auth.strip().strip('.')
                if auth_clean in valid_authors:
                    current_authors.append(auth_clean)
            # 去重同一文档内的重复作者
            current_authors = list(set(current_authors))
            
            # 生成所有2人及以上的合作组合
            for combo_len in range(2, len(current_authors) + 1):
                for combo in combinations(current_authors, combo_len):
                    # 排序后转元组,确保无序组合的一致性
                    sorted_combo = tuple(sorted(combo))
                    combination_counter[sorted_combo] += 1

# 按出现次数降序输出结果
for combo, count in sorted(combination_counter.items(), key=lambda x: x[1], reverse=True):
    print(f"组合: {', '.join(combo)} | 出现次数: {count}")

注意事项

  • 作者名映射:若PDF中存在作者缩写(如J. Doe对应John Doe),需提前建立缩写与全称的映射表,避免匹配遗漏
  • 扫描件处理:扫描生成的PDF需先通过OCR转成可编辑文本,可结合pytesseract和PIL实现
  • 性能优化:无需预生成700位作者的所有可能组合,仅处理PDF中实际出现的有效作者组合,减少不必要计算

内容的提问来源于stack exchange,提问作者Ann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:01:24