如何从pandas列存储的多结构邮件中提取正文?
提取Pandas列中邮件实际正文的实现方案
针对10000封结构各异、含多轮回复的邮件,核心采用规则匹配+批量文本清理的思路处理,具体步骤和代码如下:
1. 定位邮件回复分界点
多轮回复/转发的邮件普遍带有固定分隔标识,比如:
-----Original Message-----
On [日期] [时间], [发件人] wrote:
--- 原始邮件 ---
通过正则匹配这些标记,截断标记之后的引用内容,只保留原始正文部分。
2. 清理冗余内容
邮件中常包含签名、免责声明、广告等无关信息,同样用正则匹配去除:
- 签名块(如以"Best regards," "此致,"开头的段落)
- 固定格式的免责声明(如"This email is confidential..."或中文保密话术)
- HTML格式残留(若邮件是HTML格式,先转成纯文本)
3. 批量处理代码实现
结合Pandas、正则和BeautifulSoup实现自定义清理函数,批量应用到目标列:
import pandas as pd import re from bs4 import BeautifulSoup def clean_email(email_content): # 处理HTML格式邮件 if "<html>" in email_content.lower(): soup = BeautifulSoup(email_content, "html.parser") email_content = soup.get_text(separator="\n") # 移除回复/转发引用内容 reply_triggers = [ r"-----Original Message-----.*", r"---------- Forwarded message ----------.*", r"On .* wrote:\s*.*", r"--- 原始邮件 ---.*", r"^\s*>.*$" # 清理带>的引用行 ] for pattern in reply_triggers: email_content = re.sub(pattern, "", email_content, flags=re.DOTALL | re.MULTILINE) # 移除签名和免责声明 redundant_patterns = [ r"(Best regards|Sincerely|Regards|此致|感谢您的支持,\s*).*", r"This email is confidential.*", r"本邮件为保密信息.*", r"©.*保留所有权利.*" ] for pattern in redundant_patterns: email_content = re.sub(pattern, "", email_content, flags=re.DOTALL | re.MULTILINE) # 清理多余换行和空格 email_content = re.sub(r"\n\s*\n", "\n", email_content).strip() return email_content # 应用到DataFrame列 df["clean_email"] = df["email"].apply(clean_email)
4. 迭代优化规则
由于邮件结构差异大,处理后需抽样检查错误案例,补充新的正则规则(比如某些公司的专属分隔标记)。对于极少数规则无法覆盖的邮件,可人工标记后单独处理,或用轻量NLP模型辅助区分正文与冗余内容。
内容的提问来源于stack exchange,提问作者Django0602
相关产品推荐
相关产品推荐

