使用正则表达式提取杂乱德语文本词汇的代码问题咨询
问题核心原因
- 编码使用错误:你用
unicode_escape编码读取普通德语文本会导致德文字符(变音äöüß、特殊重音字符等)被错误转义,文本直接乱码被切割,这就是你出现gepr这类残词、总词汇量远低于预期的核心原因。 - 未提前清理混杂标记:原始文本包含大量维基格式标记、HTML转义字符、引用标签、注释块、外链内容,这些非正文内容没被清理就直接正则匹配,会产生大量无意义字符(比如
com来自域名、X来自电影名后缀)。 - 正则规则不完善:未限制匹配的最小长度,也没有做非词汇内容过滤,导致大量单字母垃圾内容被提取,也容易把带特殊符号的词切错。
现有代码调整方案
以下是可直接运行的修改后代码,可解决当前的全部已知问题:
import re import html # 提前定义文本清理规则,过滤所有非正文标记 def clean_wiki_text(raw_text): # 解析HTML转义字符 text = html.unescape(raw_text) # 删除注释块 text = re.sub(r'<!--.*?-->', '', text, flags=re.DOTALL) # 删除引用标签及内部内容 text = re.sub(r'<ref.*?>.*?</ref>', '', text, flags=re.DOTALL) # 删除{{模板}}内容 text = re.sub(r'{{.*?}}', '', text, flags=re.DOTALL) # 处理维基内部链接:[[xxx|yyy]]保留显示文字yyy,[[xxx]]保留xxx text = re.sub(r'\[\[(?:[^|]*?\|)?([^\]]*?)\]\]', r'\1', text) # 删除粗体、斜体标记''、''' text = re.sub(r"'+", '', text) # 删除标题标记==、=== text = re.sub(r'=+', '', text) # 删除所有外部链接 text = re.sub(r'https?://\S+', '', text) # 删除列表标记、数字、剩余标点符号 text = re.sub(r'[*0-9,.!?;:()\[\]{}|/\-"#%&=+<>]', ' ', text) return text with open('C:\\path\\text.txt', encoding='utf-8', errors='replace') as f, open('word_list.txt', 'w', encoding='utf-8') as f1: raw_content = f.read() cleaned_content = clean_wiki_text(raw_content) # 仅匹配长度≥2的德语/英语词汇,自动过滤单字母垃圾内容 words = set(re.findall(r'[a-zA-ZäöüÄÖÜß]{2,}', cleaned_content)) f1.write('\n'.join(sorted(words)))
核心调整点:
- 把文件读取编码更换为
utf-8,增加errors='replace'避免个别异常字符导致读取失败 - 增加了完整的标记清理逻辑,提前过滤所有非正文的格式内容
- 正则匹配增加长度限制
{2,},自动过滤无意义的单字符结果 - 把追加写入改为覆盖写入,避免多次运行产生重复内容
更优的过滤方案
如果需要更高的分词准确率,避免正则匹配的漏判错判,可以使用专业NLP工具处理:
- 使用
spaCy的德语预训练模型,可实现精准分词、词性标注,自动过滤标点、非词汇内容 - 如果统计频次时需要合并同一词汇的不同形态(比如德语的名词变格、动词变位),可以增加词形还原步骤,大幅降低统计结果的冗余度
内容的提问来源于stack exchange,提问作者n.mathfreak
相关产品推荐
相关产品推荐

