Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

基于说话人状态追踪与显隐关系建模的对话情绪识别方法研究(中国科学院大学2026春季情感识别大作业)

Python 环境

conda create --prefix=./emo python=3.10
conda activate ./emo
conda env create -f environment.yml

运行流程

本项目分为两个阶段:

  1. 生成数据缓存;
  2. 运行 scripts/train_llm.sh 训练并且测试模型。

0. 准备数据

您需要根据 PRC-Emo 的说明准备相应的数据文件到 SR-PRC/data。

1. 构建检索库

python src/get_rag_final.py

2. 生成 LLM 缓存

选择 API 模式或本地模型模式二者之一即可。每个 LLM 生成命令一次处理一个数据集。下面示例使用 --dataset_name iemocap;生成 MELD 缓存时改为 --dataset_name meld。

API 模式:

export DASHSCOPE_API_KEY="sk-xxx"
GEN_ID=deepseek-v4-flash

# 生成说话人特征。
python src/llm_bio_extract_v2.py \
  --dataset_name iemocap \
  --llm_backend api \
  --api_model "${GEN_ID}" \
  --api_concurrency 32 \
  --output_llm_id "${GEN_ID}"

# 生成显式/隐式情绪解释。
python src/llm_emotion_extract_v2.py \
  --dataset_name iemocap \
  --llm_backend api \
  --api_model "${GEN_ID}" \
  --api_concurrency 32 \
  --output_llm_id "${GEN_ID}"

# 生成 EIA 显隐情绪评估。
python src/llm_appraisal_extract.py \
  --dataset_name iemocap \
  --emotion_llm_id "${GEN_ID}" \
  --speaker_desc_llm_id "${GEN_ID}" \
  --llm_backend api \
  --api_model "${GEN_ID}" \
  --api_concurrency 32 \
  --output_llm_id "${GEN_ID}"

# 生成 DSEM 动态说话人情绪状态记忆。
python src/llm_dynamic_memory_extract.py \
  --dataset_name iemocap \
  --emotion_llm_id "${GEN_ID}" \
  --llm_backend api \
  --api_model "${GEN_ID}" \
  --api_concurrency 32 \
  --output_llm_id "${GEN_ID}"

本地模型模式:

LOCAL_GEN_MODEL=/PRC-Emo/ckpt/Qwen3-14B
GEN_ID=Qwen3-14B

# 生成说话人特征。
python src/llm_bio_extract_v2.py \
  --dataset_name iemocap \
  --llm_backend local \
  --local_model_path "${LOCAL_GEN_MODEL}" \
  --output_llm_id "${GEN_ID}"

# 生成显式/隐式情绪解释。
python src/llm_emotion_extract_v2.py \
  --dataset_name iemocap \
  --llm_backend local \
  --local_model_path "${LOCAL_GEN_MODEL}" \
  --output_llm_id "${GEN_ID}"

# 生成 EIA 显隐情绪评估。
python src/llm_appraisal_extract.py \
  --dataset_name iemocap \
  --emotion_llm_id "${GEN_ID}" \
  --speaker_desc_llm_id "${GEN_ID}" \
  --llm_backend local \
  --local_model_path "${LOCAL_GEN_MODEL}" \
  --output_llm_id "${GEN_ID}"

# 生成 DSEM 动态说话人情绪状态记忆。
python src/llm_dynamic_memory_extract.py \
  --dataset_name iemocap \
  --emotion_llm_id "${GEN_ID}" \
  --llm_backend local \
  --local_model_path "${LOCAL_GEN_MODEL}" \
  --output_llm_id "${GEN_ID}"

只有计划在训练中启用 EIA 或 DSEM 时,才需要运行对应的可选生成命令。请确保 GEN_ID 与 scripts/train_llm.sh 中的缓存后缀设置一致。

所有生成脚本默认都会从已有缓存断点续跑。llm_bio_extract_v2.py 和 llm_emotion_extract_v2.py 现在也会在一个完整对话生成完成后立即写盘,与 EIA/DSEM 的断点保存方式保持一致。只有明确想从头重生成已有缓存时,才需要加 --overwrite。

3. 配置训练

编辑 scripts/train_llm.sh。

首先确认数据集名称、训练底座模型和生成缓存的后缀:

DATANAME="iemocap"                              # 有效取值:iemocap | meld
MODEL_ID="/path/to/Qwen2.5-7B-Instruct"        # IEMOCAP 训练使用
# MODEL_ID="/path/to/Qwen3-8B"                 # MELD 训练使用
EXTRACT_PROMTING_LLM_ID="deepseek-v4-flash"  # 本地生成时可改为 Qwen3-14B
SPEAKER_DESC_LLM_ID="deepseek-v4-flash"      # 本地生成时可改为 Qwen3-14B
EIA_APPRAISAL_LLM_ID="deepseek-v4-flash"     # 仅 USE_EIA_APPRAISAL=1 时使用
DYNAMIC_MEMORY_LLM_ID="deepseek-v4-flash"    # 仅 USE_DYNAMIC_MEMORY=1 时使用

MODEL_ID 是训练阶段通过 --base_model_id 使用的微调底座模型,和生成缓存时的 GEN_ID 不是同一个含义。需要注意的是,IEMOCAP 使用 Qwen2.5-7B-Instruct训练,MELD 使用 Qwen3-8B训练。

然后选择实验设置:

# PRC-Emo baseline
USE_DYNAMIC_MEMORY=0
USE_EIA_APPRAISAL=0

# 仅启用 DSEM
USE_DYNAMIC_MEMORY=1
USE_EIA_APPRAISAL=0

# 仅启用 EIA
USE_DYNAMIC_MEMORY=0
USE_EIA_APPRAISAL=1

# 同时启用 DSEM + EIA
USE_DYNAMIC_MEMORY=1
USE_EIA_APPRAISAL=1

开始训练:

bash scripts/train_llm.sh

4. 重要参数说明

生成脚本参数:

  • --llm_backend:生成后端,可选 api 或 local。
  • --api_model:API 模式下使用的模型名。
  • --api_concurrency:API 并发请求数。
  • --local_model_path:本地模型模式下的模型路径。
  • --output_llm_id:生成 JSON 文件名中的模型后缀,必须与 scripts/train_llm.sh 中对应的 *_LLM_ID 保持一致。
  • --dataset_name:数据集名。示例中显式设置为 iemocap;使用 MELD 时设为 meld。
  • --data_folder:数据目录,默认 ./data/。
  • --splits:EIA/DSEM 需要处理的数据划分,通常为 valid test train。
  • --emotion_llm_id:EIA/DSEM 读取的显式/隐式情绪解释缓存后缀。
  • --speaker_desc_llm_id:EIA 读取的 spdescV6 说话人特征缓存后缀。
  • --history_window:EIA/DSEM 生成时使用的历史话语窗口大小。
  • --overwrite:覆盖已有缓存并从头重新生成。不加该参数时,生成脚本会读取已有缓存并跳过已完成的对话。
  • --max_conversations:只处理前 N 个尚未处理的对话,适合调试。

训练脚本开关:

  • DATANAME:训练使用的数据集名称,会作为 --dataset_name 传给训练程序。有效取值:iemocap 或 meld。
  • MODEL_ID:训练阶段使用的底座模型路径。IEMOCAP 使用 Qwen2.5-7B-Instruct,MELD 使用 Qwen3-8B。
  • USE_DYNAMIC_MEMORY:是否启用 DSEM。
  • USE_EIA_APPRAISAL:是否启用 EIA。
  • EIA_AUXILIARY_RATIO:训练集中混入显隐评估辅助任务样本的比例。0.0 表示只把 appraisal 拼入分类 prompt;1.0 表示每条训练话语额外加入一个辅助任务样本。

5. 下载以及处理好的数据集与模型权重文件

您可以下载 数据集 与 模型权重文件,或者运行下面的命令。

# 下载数据集:
modelscope download --dataset FanshuoZeng/SR-PRC_data
# 下载模型权重文件:
modelscope download --model FanshuoZeng/SR-PRC_finetuned_llm

致谢

本工作是在 PRC-Emo 的基础上实现的,感谢他们杰出的工作!

引用

如果本项目对你的研究有帮助,请考虑引用:

@article{Li_Liu_Qiao_Xu_2026,
  title={Do LLMs Feel? Teaching Emotion Recognition with Prompts, Retrieval, and Curriculum Learning},
  volume={40},
  url={https://ojs.aaai.org/index.php/AAAI/article/view/40446},
  DOI={10.1609/aaai.v40i38.40446},
  number={38},
  journal={Proceedings of the AAAI Conference on Artificial Intelligence},
  author={Li, Xinran and Liu, Yu and Qiao, Jiaqi and Xu, Xiujuan},
  year={2026},
  month={Mar.},
  pages={31778-31786}
}

About

国科大“情感计算”课程大作业

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages