如何清理DataFrame中德语文本的重复段落与残缺重复句?
德语文本清理方案:解决残缺重复句问题
问题根源
残留的残缺重复句本质是原始文本存在空格缺失(如derFusion应为der Fusion)、换行断句、标点不规范等问题,导致分句后的句子与完整句存在细微差异,普通完全匹配去重无法识别。
分步解决方案
1. 文本预处理:修复格式缺陷
先统一处理文本中的格式问题,消除残缺句的产生基础:
import re import pandas as pd from nltk.tokenize import sent_tokenize def preprocess_german_text(text): # 替换HTML引号为标准引号 text = text.replace('"', '"') # 合并非句末换行(避免换行导致的断句) text = re.sub(r'(?<!\.)\n', ' ', text) # 在小写词后的大写字母前加空格,修复单词连写(如derFusion → der Fusion) text = re.sub(r'(?<=[a-zäöüß])([A-ZÄÖÜ])', r' \1', text) # 在小写词后的标点前加空格,修复连写(如SüddeutschenZeitung → Süddeutschen Zeitung) text = re.sub(r'(?<=[a-zäöüß])([.,:;!?])', r' \1', text) # 移除无意义的结尾标记 text = re.sub(r'Jetzt teilen auf:$', '', text).strip() return text
2. 精准分句
预处理后再用nltk德语分句工具,大幅减少残缺句产生:
# 假设你的DataFrame名为df,文本列名为text_column df['cleaned_text'] = df['text_column'].apply(preprocess_german_text) # 分句处理生成句子列表 df['sentences'] = df['cleaned_text'].apply(lambda x: sent_tokenize(x, language='german'))
3. 智能去重:覆盖格式差异的重复句
仅完全匹配去重无法处理格式差异,需先对句子规范化,再基于核心语义去重:
def normalize_sentence(sent): # 转小写、去多余空格、去句末标点,保留核心语义 sent = sent.lower().strip() sent = re.sub(r'\s+', ' ', sent) sent = re.sub(r'[.,:;!?]$', '', sent) return sent def deduplicate_sentences(sent_list): seen = set() unique_sents = [] for s in sent_list: norm_s = normalize_sentence(s) if norm_s not in seen: seen.add(norm_s) unique_sents.append(s) return unique_sents # 对每行的句子列表去重 df['unique_sentences'] = df['sentences'].apply(deduplicate_sentences)
4. 最终过滤:移除无效残缺句
若仍有少量残缺句,通过长度、语义完整性过滤:
def filter_invalid_sents(sent_list): valid_sents = [] for s in sent_list: # 过滤过短句子(少于5个单词) if len(s.split()) < 5: continue # 过滤不含动词的句子(匹配德语常见动词后缀) if not re.search(r'(e|en|n|t|st|t)$', s.strip().split()[-1]): continue valid_sents.append(s) return valid_sents df['final_cleaned_sents'] = df['unique_sentences'].apply(filter_invalid_sents)
效果验证
针对你提供的示例文本,预处理后会修复derFusion→der Fusion、Monsantowill→Monsanto will等问题,分句后完整句与重复句完全一致,结合规范化去重可彻底移除重复内容,无残缺句残留。
内容的提问来源于stack exchange,提问作者Mostafa Bouzari
相关产品推荐
相关产品推荐

