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

Outlook邮件词频统计:将所有邮件词频合并至单个DataFrame

需求:汇总所有Outlook邮件词频至单个DataFrame

原代码会为每封邮件生成独立的词频统计DataFrame,相同词汇的计数无法累加。需要修改代码,将所有邮件的词频汇总到一个DataFrame中,实现相同词汇的计数累加(例如同一词汇在多封邮件中出现的次数总和)。

修改后的完整代码

import win32com.client
import datetime as dt
import re
import pandas as pd

# 设置时间过滤器:只处理最近2天的邮件
DateFilter = dt.datetime.now() - dt.timedelta(days=2)

# 连接Outlook MAPI
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
# 获取收件箱文件夹
inbox = outlook.GetDefaultFolder(6)
root_folder = outlook.Folders.Item(1)
print(root_folder.Name)

# 对邮件按接收时间倒序排序
messages = inbox.Items
messages.Sort("[ReceivedTime]", True)
# 应用时间过滤条件
DateFilterMsg = messages.Restrict("[ReceivedTime] >= '" + DateFilter.strftime('%m/%d/%Y %H:%M %p') + "'")

# 初始化全局词频统计字典,用于累加所有邮件的词汇计数
word_counts = {}

for message in DateFilterMsg:
    if message.Class == 43:  # 确认是邮件对象
        # 获取邮件纯文本内容并转为小写,避免大小写导致的重复统计
        body_text = message.Body.lower()
        # 使用正则表达式分割词汇,处理非空格分隔的情况(如标点、换行)
        words = re.findall(r'\b\w+\b', body_text)
        
        # 遍历当前邮件的词汇,累加计数到全局字典
        for word in words:
            # 过滤掉长度过短的无意义词汇(如单个字符)
            if len(word) > 1:
                word_counts[word] = word_counts.get(word, 0) + 1

# 将全局词频字典转换为DataFrame
df_total = pd.DataFrame(word_counts.items(), columns=['word_name', 'word_cnt'])
# 按词频降序排序,方便查看高频词汇
df_total = df_total.sort_values(by='word_cnt', ascending=False).reset_index(drop=True)

# 打印汇总结果
print(df_total)

关键改动说明

  • 全局词频字典:初始化word_counts字典,替代原代码中每封邮件单独生成DataFrame的逻辑,实现跨邮件的计数累加
  • 词汇处理优化:
    • 将邮件内容转为小写,避免System和system被统计为不同词汇
    • 使用正则表达式re.findall(r'\b\w+\b', body_text)分割词汇,处理标点、换行等非空格分隔的情况,比单纯用split(" ")更准确
    • 过滤长度≤1的词汇,排除无意义的单个字符(如标点拆分后的残留、单字母)
  • 统一生成DataFrame:所有邮件处理完成后,再将字典转换为最终的汇总DataFrame,并按词频降序排序,提升可读性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:57:37