Python使用Regex对PDF提取文本分词时避免单词拆分的方法咨询
解决PDF文本分词单词拆分问题的方案
导致分词时单词被拆分的问题通常来源于三个环节,对应解决方案如下:
1. 修复PDF文本提取逻辑
问题根源:你当前使用的PyPDF2的extractText()方法对排版复杂的PDF(多栏、带断词连字符、特殊字体)提取效果很差,经常会在单词中间插入空格、或者把跨行的带连字符单词拆成两段,你拿到的字符串s本身就已经存在单词拆分问题,后续分词自然不对。
解决方法:替换为更稳定的文本提取工具,同时处理跨行断词:
# 用pypdf(PyPDF2官方维护的新版)替代原有PyPDF2 from pypdf import PdfReader reader = PdfReader(file) s = "" # 保持跳过前2页的逻辑不变 for page in reader.pages[2:]: s += page.extract_text() # 处理跨行的连字符断词,比如把"exam-\nple"合并为"example" s = s.replace("-\n", "")
如果提取效果还是不理想,可以换用pdfplumber库,对复杂排版的适配性更好。
2. 替换手写分句逻辑
问题根源:你手写的按.切分句子的逻辑会误切Mr.、U.S.A.这类带点的缩写,把完整的内容拆到两个句子中,间接导致单词被拆分。
解决方法:直接使用nltk内置的分句工具,已经内置了常见缩写的切分例外规则:
import nltk # 首次运行需要下载punkt数据包,后续运行可注释掉该行 nltk.download('punkt') sentences = nltk.sent_tokenize(s)
3. 调整分词匹配规则
问题根源:你当前使用的RegexpTokenizer(r'\w+')仅匹配字母、数字、下划线,遇到带撇号的don't、带连字符的COVID-19这类词时会直接拆成多个片段。
解决方法:调整正则规则适配英文单词的常见格式,或者直接用nltk官方分词器:
# 方案A:调整正则规则,支持带撇号、连字符的完整单词匹配 from nltk.tokenize import RegexpTokenizer tokenizer = RegexpTokenizer(r"[a-zA-Z0-9]+(?:[-'][a-zA-Z0-9]+)*") corpus = [tokenizer.tokenize(sentence) for sentence in sentences] # 方案B:直接用nltk官方word_tokenize,适配场景更全面 from nltk.tokenize import word_tokenize corpus = [word_tokenize(sentence) for sentence in sentences]
内容的提问来源于stack exchange,提问作者huy
相关产品推荐
相关产品推荐

