這個專案用來整理公司各個 LINE 頻道匯出的聊天紀錄,將原始 .txt 檔清洗成結構化 CSV,方便後續查閱、篩選、交接與分析。
目前主流程是:
- 將 LINE 匯出的文字檔放進
data/raw/ - 由
main.py讀取config.json - 解析聊天紀錄、辨識使用者、過濾系統訊息與不需要的內容
- 將結果輸出到
data/output/*.csv - 視需要再用
scripts/csv_splitter.py將 CSV 拆成多個 Markdown 檔
chat_log_cleaner/
├── main.py
├── config.json
├── data/
│ ├── raw/
│ ├── output/
│ └── markdown/
├── scripts/
│ ├── chat_parser.py
│ ├── csv_splitter.py
│ ├── smart_user_identifier.py
│ ├── url_restorer.py
│ ├── user_directory_manager.py
│ ├── user_identifier.py
│ ├── utils.py
│ └── TreeMaker.py
├── requirements.txt
└── README.md
main.py專案主入口。掃描data/raw/*.txt,逐檔清洗並輸出 CSV。scripts/chat_parser.py聊天紀錄解析核心。負責日期解析、訊息拆解、多行訊息處理、關鍵字過濾、關注標記與網址還原。scripts/smart_user_identifier.py智能使用者辨識。從聊天樣本推測真正的發話者,適合群組聊天。scripts/url_restorer.py將訊息內容中的 percent-encoded 網址片段還原成可讀中文網址。scripts/user_identifier.py傳統使用者辨識備援。scripts/user_directory_manager.py讀取config.json內的使用者名冊,做公司內部已知名稱的精準比對。scripts/csv_splitter.py將清洗後的 CSV 拆成多個 Markdown 檔,方便閱讀或交接。scripts/utils.py共用工具,例如讀取設定、輸出 CSV、專案路徑處理。
pip install -r requirements.txt將 LINE 匯出的聊天文字檔放到 data/raw/。
建議:
- 一個頻道一個
.txt - 檔名保留原始群組名稱即可
- 原始檔請使用 UTF-8
目前實際會用到的設定如下:
{
"date_range": {
"start": "2025-10-15",
"end": "2025-12-31"
},
"watchlist_users": [
"關注用戶1",
"關注用戶2"
],
"exclude_keywords": [
"加入聊天",
"退出社群",
"退出群組",
"封鎖",
"解除封鎖",
"Auto-reply"
],
"watchlist_keywords": [
"維修",
"道歉",
"客人",
"有錢",
"社會中堅",
"小屁孩"
],
"user_directory": {
"users": [
"王小明",
"客服_Amy",
"電商部_陳小華"
]
},
"analysis_settings": {
"sample_count_智能識別樣本數量": 500,
"traditional_sample_count_傳統識別樣本數量": 20,
"min_frequency_private_私聊最小頻率": 0.05,
"min_frequency_group_社群最小頻率": 0.03,
"min_content_diversity_最小內容多樣性": 0.05,
"max_user_name_length_用戶名最大長度": 20,
"min_user_name_length_用戶名最小長度": 2
},
"parsing_settings": {
"emoji_chars": ["😀", "😂", "😅", "🙏", "~"],
"content_indicators": ["貼圖", "圖片", "影片", "語音訊息", "檔案", "位置"],
"conversation_starters": ["嗨嗨", "想跟你討教", "順便問一下", "我還是先", "我把樓上", "合約都", "然後", "User~"]
}
}start只保留這個日期之後的訊息。end只保留這個日期之前的訊息。
指定要特別標記的使用者名稱。輸出 CSV 時,這些人的訊息會被標為 True。
只要訊息內容或名稱中包含這些關鍵字,就直接過濾掉。適合排除:
- 加入聊天
- 退出群組
- 系統通知
- 自動回覆
只要訊息內容包含這些關鍵字,就算發話者不在 watchlist_users,也會被標記成重點訊息。
sample_count_智能識別樣本數量智能辨識會先抽前幾筆訊息來估算常見發話者。traditional_sample_count_傳統識別樣本數量傳統備援辨識要看的樣本數。min_frequency_private_私聊最小頻率私聊模式下,使用者最低出現比例。min_frequency_group_社群最小頻率群組模式下,使用者最低出現比例。min_content_diversity_最小內容多樣性避免把重複內容或非真人訊息誤判成使用者。max_user_name_length_用戶名最大長度控制名稱過長時不當成正常使用者。min_user_name_length_用戶名最小長度控制名稱過短時不當成正常使用者。
users公司內已知會出現的 LINE 名稱清單。這份名單的用途是幫 parser 精準認人,不是重點標記。
emoji_chars幫助判斷某段文字比較像表情或內容,不像使用者名稱。content_indicators像貼圖、圖片、影片這種特殊內容標記。conversation_starters用來幫助拆分「名稱 / 內容」邊界的對話起始詞。
現在使用者名冊已經合併進 config.json 的 user_directory.users。
建議把公司內常見的 LINE 顯示名稱都放進這裡,特別是:
- 名稱有空格
- 名稱有括號
- 名稱有部門前綴
- 名稱很容易跟一般訊息混淆
這份名單的目的,是讓 parser 更穩定辨識「誰是使用者名稱」。
python main.py執行後會:
- 讀取
config.json - 掃描
data/raw/*.txt - 將每個頻道輸出成一個
data/output/*.csv
python scripts/csv_splitter.py常用參數:
python scripts/csv_splitter.py --max-files 5 --min-records 200
python scripts/csv_splitter.py --file "data/output/某個頻道.csv"輸出的 CSV 固定包含 5 欄:
日期時間使用者訊息內容是否關注對象
scripts/csv_splitter.py 會依筆數將 CSV 平均拆成多個 .md 檔,輸出到 data/markdown/。
用途:
- 分批閱讀大群組聊天
- 交給同事逐段檢查
- 供後續 AI 或人工摘要使用
目前主流程在輸出 CSV 前,會對訊息內容額外做兩件事:
- 還原 LINE
@tag的標準名稱,例如@呆✨[宜加寵物_曾琪晏_小呆] - 還原網址中的中文路徑,例如把
Monge-%E7%91%AA%E6%81%A9%E5%90%89還原成Monge-瑪恩吉
目前解析器有處理這些常見格式:
- 日期行:
2025.10.15 星期三 - 日期行:
2025/10/15(週三) - 訊息行:
12:04\t使用者\t內容 - 訊息行:
12:04 使用者 內容 - 多行訊息續行
- 公司群組聊天清洗
- 部門頻道整理
- 客服或電商營運群訊息回顧
- 需要先把 LINE 原始文字轉成乾淨表格再分析的情境
- 這個專案會處理真實聊天紀錄,請注意個資與公司內部資訊
- 若輸出 CSV 被 Excel 開啟中,再次覆寫時會寫入失敗
- Windows 終端可能無法完整顯示 emoji,但檔案內容本身仍會保留
config.json內的user_directory.users若留空,程式仍可運作,但會更依賴智能辨識
- 若公司頻道名稱或成員命名規則固定,優先維護
config.json內的user_directory.users - 若常有新的系統訊息樣式,優先更新
exclude_keywords - 若某些人常被辨識錯誤,再調整
analysis_settings
此專案主要供內部整理與研究使用,使用時請遵守公司資料管理與隱私規範。