# py_ai_chat **Repository Path**: lujianfei/py_ai_chat ## Basic Information - **Project Name**: py_ai_chat - **Description**: Python 版AI对话Demo - **Primary Language**: Python - **License**: MulanPSL-1.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 2 - **Created**: 2020-06-21 - **Last Updated**: 2026-02-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # py_ai_chat #### 流程图 ```mermaid graph TD A[Start] --> B{"Model Exists?"} B -- Yes --> C[Load Model from Pickle] C -- Success --> D[Return Model] C -- Fail --> E{"Data Exists?"} B -- No --> E E -- Yes --> F[Load Data from JSON] E -- No --> G[Generate Default Data] G --> H[Save Data to JSON] H --> F F --> I[Train Model] I --> J["Tokenize Questions (jieba)"] J --> K["Vectorize (TF-IDF)"] K --> L[Calculate TF-IDF Matrix] L --> M[Save Model to Pickle] M --> D D --> N["Start Loop (Test Questions)"] N --> O[Get Answer] O --> P[Tokenize Input Question] P --> Q["Transform to Vector (TF-IDF)"] Q --> R[Calculate Cosine Similarity] R --> S[Find Index of Max Similarity] S --> T[Retrieve Corresponding Answer] T --> U[Print Result] U --> V{"More Questions?"} V -- Yes --> N V -- No --> W[End] ``` ## 对话模型.pk 是一个 Python 的 pickle 文件,它存储了一个字典(Dictionary)对象,包含了经过预处理和训练后的模型关键数据。 以下是该文件解包后的内部结构: | 键 (Key) | 数据类型 (Type) | 描述 | 示例内容 | | :--- | :--- | :--- | :--- | | **question** | `list` (列表) | 原始问题列表,用于与输入问题进行匹配 (分词前)。 | `['在吗?', '在干嘛?', '我饿了']` | | **answer** | `list` (列表) | 对应的答案列表,当问题匹配成功后,返回此列表中对应索引的答案。 | `['亲,在的。', '在想你呀!', '来我家,做饭给你吃~']` | | **vectorizer** | `TfidfVectorizer` | 已训练好的 Scikit-learn 特征提取器对象。包含了词汇表(vocabulary)和模型参数,用于将新问题转换为向量。 | `TfidfVectorizer(token_pattern='(?u)\b\w+\b')` | | **tfidf_matrix** | `csr_matrix` | 稀疏矩阵 (Sparse Matrix)。存储了所有训练语料(问题)的 TF-IDF 向量。每一行代表一个问题,每一列代表一个词特征。 | `(4, 9)` 维度的矩阵,表示有4个问题,词表中共有9个特征词。 | ### 结构关系图 当你通过 `main.py` 加载模型时,它会读取这个文件并还原成 `Model` 类实例: 1. 用户输入 "在吗" 2. 使用 `vectorizer` 将 "在吗" 转换成向量 `vec`。 3. 计算 `vec` 与 `tfidf_matrix` 中每一行的余弦相似度。 4. 找到相似度最高的那一行的索引 `index`。 5. 从 `answer` 列表中取出 `answer[index]` 作为回答。