内容提要
作者介绍了撰写年度总结所用的工具链:用org-mode记录日记与工作日志,并通过orgparse解析其树形结构;微信记录经EFB转发至Telegram后导出,B站记录则用脚本抓取。中文分词选用LTP,需在本地下载模型。用ImageMagick生成词云mask并裁剪白边,用july绘制热力图,用wordcloud配合中文字体与mask生成词云,用matplotlib_venn_wordcloud制作韦恩词云,其余图表用pandas和matplotlib绘制,布局采用subplot_mosaic。
延伸解读
数据来源与解析:org-mode 与 orgparse 的配合
作者用 org-mode 手工记录日记和工作日志,形成树形结构,并用 orgparse 解析。orgparse 能直接遍历节点,也能提取 clock 记录,但解析时会丢失 note 内容,因此作者只用于大类时间统计,依赖 note 的分析仍需自行处理。这提示读者:选择解析工具时需确认其保留的字段是否满足分析需求,必要时补充自定义解析。
中文分词工具选型:LTP 的本地化部署
作者对比了 jieba、pkuseg、LTP 等工具,最终选择 LTP 因其持续更新且 4.0 后升级为 PyTorch 模型。但 LTP 默认从 Huggingface 下载模型,在大陆可能失败,建议手动下载并指定本地路径。对于需要实体识别或更好分词效果的中文文本分析,LTP 是值得尝试的选项,但需注意模型部署的环境问题。
词云定制:字体、mask 与韦恩词云
wordcloud 默认不支持中文,需通过 font_path 指定中文字体;结合 ImageMagick 生成的 mask 图像,可让词云呈现特定形状。对于双方对话关键词对比,matplotlib_venn_wordcloud 能绘制韦恩词云,但同样需设置中文字体。这些工具组合灵活,但中文支持需额外配置,适合有定制化可视化需求的分析者。
布局技巧:subplot_mosaic 的直观排版
作者使用 matplotlib.pyplot.subplot_mosaic 来设计多子图布局,通过字符串或列表直观指定每个子图占据的行列位置,例如 'ABC;DDD' 表示第一行三个子图各占 1/3,第二行一个子图占满整行。这种方法比传统 subplot 更易调整复杂布局,适合需要在一张图中组合多个图表的场景。
Q&A
写年度总结时,日记和工作日志是怎么记录的?
作者使用 org-mode 手工记录日记和工作日志。工作日志是「年-月-日-具体记录」的四级结构,日记是「日-具体记录」的两级结构。
如何解析 org-mode 文件中的树形结构和 clock 记录?
使用 Python 的 orgparse 库,它可以将 org-mode 文件解析成树形结构,遍历节点即可处理内容。对于任务下的 clock 记录,orgparse 也能解析出来,但会丢失 note 信息,因此作者只用于大类时间统计。
微信和 B 站的记录是怎么导出的?
微信聊天记录通过 EFB 转发到 Telegram,再利用 Telegram 的导出功能导出历史消息。B 站观看记录则是作者自己写脚本抓取的。
中文分词为什么选 LTP?使用时要注意什么?
作者选择 LTP 是因为它持续更新,4.0 后升级为 pytorch 模型。使用时建议提前下载模型到本地,否则会从被屏蔽的 Huggingface 下载导致失败。
如何用 wordcloud 绘制中文词云并自定义形状?
先用 LTP 分词统计词频,然后使用 WordCloud 类的 generate_from_frequencies 方法绘制。需通过 font_path 参数指定中文字体(如文泉驿微米黑),并通过 mask 参数传入 ImageMagick 生成的 mask 图像来定制形状。
韦恩词云是用什么工具做的?怎么设置中文?
使用 matplotlib_venn_wordcloud 库的 venn2_wordcloud 函数。由于对中文支持不好,需要在 matplotlib 的 rcParams 中设置中文字体,并在 wordcloud_kwargs 中指定 font_path。
绘制多子图时如何方便地布局?
使用 matplotlib.pyplot.subplot_mosaic 函数,通过字符串或列表直观指定子图占据的行列,例如 'ABC;DDD' 表示第一行三个子图各占 1/3,第二行一个子图占整行。