利用关键词匹配算法,将杂乱无章的支付备注转化为结构化的财务报表,彻底告别手动打钩分类的痛苦。

 

以下是完整的项目交付文档:

 

项目名称:SmartLedger-NLP (智能流水分类脚本)

 

一、 实际应用场景描述

 

场景: 月底了,你的微信和支付宝账单加起来有200多笔。

 

现状: 你看着满屏的“商户单号”、“二维码收款”、“扫一扫付款”,完全想不起来上周三下午那笔28.5元到底买了什么。

 

操作流程:

 

1. 从微信/支付宝导出CSV账单(通常备注栏是混乱的)。

2. 运行本脚本,指定文件路径。

3. 程序自动扫描“交易备注”和“交易对方”字段。

4. 输出一份新的 

"classified_ledger.csv",其中新增了“消费类别”列(餐饮/交通/购物/娱乐...)。

5. 直接导入Excel进行透视分析。

 

二、 引入痛点 (Pain Points)

 

传统记账方式存在以下痛点:

 

1. 语义模糊: “肯德基宅急送” ≠ “餐饮”,机器看不懂。

2. 重复性劳动: 每个月都要手动把相似的商家拖到同一个分类里。

3. 规则滞后: 遇到新出现的APP(如“朴朴超市”),旧规则无法识别。

4. 非技术门槛: 普通人不会写Excel宏,只能肉眼分类。

 

本方案的解决思路:

 

利用 “关键词正则匹配 + 优先级权重” 算法。建立一个“财务词典”,让Python像老会计一样,看到“美团”、“饿了么”就知道是“餐饮”,看到“滴滴”、“地铁”就知道是“交通”。

 

三、 核心逻辑讲解 (Algorithm Logic)

 

我们采用 “字典树 (Trie) 简化版 —— 哈希表匹配” 算法:

 

1. 规则库构建 (Rule Base):

   - 创建一个字典,键是分类(Category),值是关键词列表。

   - 例:

"{"餐饮": ["麦当劳", "肯德基", "美团", "饿了么", "星巴克"]}"。

2. 逐行扫描 (Row Scanning):

   - 读取CSV的每一行,提取 

"description" 字段。

3. 优先级匹配 (Priority Matching):

   - 为了避免歧义(比如“苹果”可能是水果也可能是手机),我们设定最长匹配优先或优先级从高到低。

   - 如果备注中包含“医院”,直接归类为“医疗”,不再往下判断。

4. 兜底策略 (Default Category):

   - 如果所有关键词都不匹配,归类为“其他”,方便人工二次审核。

 

四、 代码模块化实现 (Core Code)

 

以下是核心程序 

"smart_ledger.py"。

 

技术栈: Python 3.x + pandas (数据处理) + re (正则表达式)。

 

"""

smart_ledger.py

功能:微信/支付宝CSV流水智能分类脚本

 

日期:2026-04-13

"""

 

import pandas as pd

import re

from collections import defaultdict

 

# =========================

# 模块一:会计科目规则库 (可配置)

# =========================

ACCOUNTING_RULES = {

    "餐饮": [

        "肯德基", "麦当劳", "星巴克", "瑞幸", "美团", "饿了么",

        "必胜客", "汉堡王", "喜茶", "奈雪", "海底捞"

    ],

    "交通": [

        "滴滴", "高德", "地铁", "公交", "一卡通", "加油",

        "停车", "高铁", "飞机", "打车"

    ],

    "购物": [

        "淘宝", "京东", "拼多多", "唯品会", "盒马", "山姆",

        "便利店", "超市", "屈臣氏"

    ],

    "娱乐": [

        "电影", "影院", "KTV", "游戏", "Steam", "Netflix"

    ],

    "医疗": [

        "医院", "药房", "药店", "挂号"

    ],

    "转账": [

        "转账", "红包", "还款"

    ]

}

 

# =========================

# 模块二:NLP分类引擎

# =========================

class TransactionClassifier:

    """

    交易流水分类器

    """

    def __init__(self, rules):

        self.rules = rules

        # 预编译正则表达式以提高性能

        self.compiled_rules = self._compile_rules()

 

    def _compile_rules(self):

        """将关键词列表编译为正则表达式"""

        compiled = defaultdict(list)

        for category, keywords in self.rules.items():

            for kw in keywords:

                # 使用 re.escape 防止特殊字符干扰

                compiled[category].append(re.compile(re.escape(kw)))

        return compiled

 

    def classify(self, description: str) -> str:

        """

        对单条交易描述进行分类

        参数:

            description: 交易备注或商户名称字符串

        返回:

            分类名称 (str)

        """

        if not isinstance(description, str):

            return "其他"

 

        # 按优先级遍历规则库

        for category, patterns in self.compiled_rules.items():

            for pattern in patterns:

                if pattern.search(description):

                    return category

        

        # 如果没有匹配到任何规则

        return "其他"

 

# =========================

# 模块三:数据处理管道

# =========================

class LedgerProcessor:

    """

    账本处理器

    """

    def __init__(self, classifier: TransactionClassifier):

        self.classifier = classifier

 

    def process_csv(self, input_file: str, output_file: str):

        """

        读取CSV,添加分类列,并输出新CSV

        """

        try:

            # 微信/支付宝导出的CSV编码通常是GBK或UTF-8

            df = pd.read_csv(input_file, encoding='gbk')

        except UnicodeDecodeError:

            df = pd.read_csv(input_file, encoding='utf-8')

 

        # 智能识别列名 (微信和支付宝的列名略有不同)

        desc_column = None

        amount_column = None

        

        for col in df.columns:

            if "备注" in col or "商品" in col or "描述" in col:

                desc_column = col

            if "金额" in col or "收/支" in col: # 支付宝可能是收/支

                amount_column = col

        

        if not desc_column:

            raise ValueError("未找到交易描述列,请检查CSV格式")

 

        # 应用分类算法

        print(f"开始处理 {len(df)} 条记录...")

        df['智能分类'] = df[desc_column].apply(self.classifier.classify)

        

        # 保存结果

        df.to_csv(output_file, index=False, encoding='utf-8-sig')

        print(f"✅ 处理完成!已保存至: {output_file}")

        

        # 打印统计摘要

        self._print_summary(df)

 

    def _print_summary(self, df):

        """打印分类统计摘要"""

        print("\n📊 消费类别统计:")

        summary = df.groupby('智能分类')['智能分类'].count().sort_values(ascending=False)

        print(summary)

 

# =========================

# 模块四:主程序入口

# =========================

def main():

    # 1. 初始化分类器

    classifier = TransactionClassifier(ACCOUNTING_RULES)

    

    # 2. 初始化处理器

    processor = LedgerProcessor(classifier)

    

    # 3. 定义文件路径

    input_csv = "wechat_alipay_export.csv" # 用户需将此文件放入同目录

    output_csv = "classified_ledger.csv"

    

    # 4. 执行处理

    try:

        processor.process_csv(input_csv, output_csv)

    except FileNotFoundError:

        print(f"❌ 错误: 找不到输入文件 '{input_csv}'")

        print("请先将微信/支付宝导出的账单重命名为此文件名。")

    except Exception as e:

        print(f"❌ 发生未知错误: {e}")

 

if __name__ == "__main__":

    main()

 

五、 README.md 文件

 

# 📊 SmartLedger-NLP

> 告别手动记账:微信/支付宝流水智能分类脚本

 

## 🌟 项目简介

这是一个基于Python的命令行工具,利用关键词匹配算法自动识别微信/支付宝导出的CSV账单,将其归类为餐饮、交通、购物等科目,一键生成结构化报表。

 

## 🛠️ 环境依赖

- Python 3.8+

- pandas (pip install pandas)

 

## 🚀 快速开始

1. 从微信/支付宝导出账单,保存为 `wechat_alipay_export.csv`。

2. 将文件放在脚本同目录下。

3. 运行程序:

 

bash

 

python smart_ledger.py

 

4. 查看生成的 `classified_ledger.csv`。

 

## ⚙️ 自定义规则

打开 `smart_ledger.py`,修改 `ACCOUNTING_RULES` 字典:

 

python

 

ACCOUNTING_RULES = {

 

"我的专属分类": ["特定商家A", "特定APP_B"],

 

# ... 添加更多规则

 

}

 

六、 使用说明 (User Guide)

 

Step 1: 导出账单

 

- 微信: 我 → 服务 → 钱包 → 账单 → 常见问题 → 下载账单 → 用于个人对账。

- 支付宝: 我的 → 账单 → 右上角齿轮 → 开具交易流水证明 → 申请。

 

Step 2: 准备环境

 

- 确保电脑安装了Python 3.8+。

- 安装pandas:

"pip install pandas"。

 

Step 3: 运行与检查

 

- 将导出的CSV文件重命名为 

"wechat_alipay_export.csv"。

- 运行脚本。

- 打开输出的 

"classified_ledger.csv",检查“智能分类”列。如果有错漏,按“使用说明”修改规则库。

 

七、 核心知识点卡片 (Flash Cards)

 

卡片主题 编程/算法概念 会计/财务关联

规则引擎 字典 (Dict) 数据结构 会计科目表的数字化映射

正则表达式 

"re.compile()", 

"search()" 模糊匹配商户名称,如“XX路麦当劳”

Pandas DataFrame 表格数据处理 电子账本的自动化处理

异常处理 

"try...except" 应对脏数据、编码错误的鲁棒性

CSV编码 GBK vs UTF-8 解决Windows环境下中文乱码的关键

 

八、 总结

 

作为一名全栈工程师,我深知“数据如果不经过清洗,就是垃圾;经过算法处理,才是资产”。

 

这个记账脚本虽然只有几百行代码,但它体现了财务智能化的雏形:

 

1. 规则即逻辑: 把老会计的经验(看到什么字归哪类)变成了代码里的字典。

2. 解放双手: 将重复性劳动交给CPU,人类只负责制定规则和审核结果。

3. 数据可视化前置: 只有分类清晰的数据,才能画出漂亮的消费趋势图。

让每一分钱,都在代码的注视下各归其位。💰📈

利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐