# text_embedding 使用说明

## 这是什么？

**精简的文本相似度计算模块**，基于 similarities 库（BERT 向量模型）。

- ✅ 只有 **1 个函数**：`compare_phrases()`
- ✅ 支持 **4 种模型**
- ✅ 返回格式兼容 `semantic_similarity.py`
- ✅ 零成本，本地运行
- ✅ 总共 163 行代码

---

## 安装

```bash
pip install -U similarities torch
```

---

## 快速开始

```python
from lib.text_embedding import compare_phrases

result = compare_phrases("如何更换花呗绑定银行卡", "花呗更改绑定银行卡")

print(result['相似度'])  # 0.855
print(result['说明'])     # "基于向量模型计算的语义相似度为 高 (0.86)"
```

---

## 支持的模型

### 简称方式（推荐）

```python
# 1. chinese（默认）- 中文通用模型
result = compare_phrases("文本1", "文本2")
result = compare_phrases("文本1", "文本2", model_name="chinese")

# 2. multilingual - 多语言模型（中英韩日德意等）
result = compare_phrases("Hello", "Hi", model_name="multilingual")

# 3. paraphrase - 中文长文本模型
result = compare_phrases("长文本1...", "长文本2...", model_name="paraphrase")

# 4. sentence - 中文短句子模型
result = compare_phrases("短句1", "短句2", model_name="sentence")
```

### 完整名称方式

```python
result = compare_phrases(
    "文本1", "文本2",
    model_name="shibing624/text2vec-base-chinese"
)
```

### 模型列表

| 简称 | 完整名称 | 说明 |
|------|---------|------|
| `chinese` | `shibing624/text2vec-base-chinese` | 中文通用（默认） |
| `multilingual` | `shibing624/text2vec-base-multilingual` | 多语言 |
| `paraphrase` | `shibing624/text2vec-base-chinese-paraphrase` | 中文长文本 |
| `sentence` | `shibing624/text2vec-base-chinese-sentence` | 中文短句子 |

---

## 接口说明

```python
compare_phrases(
    phrase_a: str,           # 第一个短语
    phrase_b: str,           # 第二个短语
    model_name: str = "chinese"  # 模型（可选）
) -> Dict[str, Any]
```

**返回格式：**
```python
{
    "说明": "基于向量模型计算的语义相似度为 高 (0.86)",
    "相似度": 0.855
}
```

---

## 运行示例

```bash
python lib/text_embedding.py
```

**输出：**
```
示例 1: 默认模型（chinese）
相似度: 0.855
说明: 基于向量模型计算的语义相似度为 高 (0.86)

示例 2: 使用默认模型
相似度: 0.486
说明: 基于向量模型计算的语义相似度为 较低 (0.49)

示例 3: 不相关的短语
相似度: 0.187
说明: 基于向量模型计算的语义相似度为 低 (0.19)

示例 4: 多语言模型（multilingual）
相似度: 0.950
说明: 基于向量模型计算的语义相似度为 极高 (0.95)

============================================================
支持的模型:
------------------------------------------------------------
  chinese         -> shibing624/text2vec-base-chinese
  multilingual    -> shibing624/text2vec-base-multilingual
  paraphrase      -> shibing624/text2vec-base-chinese-paraphrase
  sentence        -> shibing624/text2vec-base-chinese-sentence
```

---

## 使用场景

### 场景 1: 中文短文本（默认）
```python
result = compare_phrases("深度学习", "神经网络")
# 使用 chinese 模型
```

### 场景 2: 多语言文本
```python
result = compare_phrases("Hello", "Hi", model_name="multilingual")
result = compare_phrases("こんにちは", "你好", model_name="multilingual")
```

### 场景 3: 中文长文本
```python
long_text_1 = "这是一段很长的文本..."
long_text_2 = "这是另一段很长的文本..."
result = compare_phrases(long_text_1, long_text_2, model_name="paraphrase")
```

### 场景 4: 中文短句子
```python
result = compare_phrases("你好", "您好", model_name="sentence")
```

---

## 默认算分逻辑

**余弦相似度（基于 BERT 向量）**

```
输入: "深度学习" vs "神经网络"
    ↓
BERT 模型转换为向量
    ↓
计算余弦相似度
    ↓
返回: 0.486
```

---

## 与 semantic_similarity 对比

| 特性 | semantic_similarity | text_embedding |
|------|---------------------|----------------|
| **算分方法** | LLM 判断 | BERT 向量 |
| **返回格式** | `{说明, 相似度}` | `{说明, 相似度}` ✅ |
| **速度** | 慢（需要调用 AI） | 快 |
| **成本** | 有 token 成本 | **零成本** |
| **模型数量** | 1 个 | **4 个** |
| **代码行数** | 508 行 | **163 行** |

---

## 常见问题

### Q1: 第一次运行会下载模型吗？
**A**: 是的，第一次使用某个模型时会自动下载（约 400MB），之后就很快了。

### Q2: 可以同时使用多个模型吗？
**A**: 可以！代码会自动缓存已加载的模型。
```python
# 第一次调用会下载 chinese 模型
result1 = compare_phrases("文本1", "文本2")

# 第一次调用会下载 multilingual 模型
result2 = compare_phrases("Hello", "Hi", model_name="multilingual")

# 第二次调用直接使用缓存的模型，速度很快
result3 = compare_phrases("文本3", "文本4")
```

### Q3: 哪个模型最好？
**A**:
- 中文短文本：`chinese`（默认）
- 多语言：`multilingual`
- 中文长文本（段落级别）：`paraphrase`
- 中文短句子：`sentence`

### Q4: 如何选择模型？
**A**: 不确定就用默认的 `chinese`，99% 的情况都够用！

---

## 总结

**只需要记住：**

```python
from lib.text_embedding import compare_phrases

# 基础用法（99% 的情况）
result = compare_phrases("文本A", "文本B")

# 切换模型
result = compare_phrases("文本A", "文本B", model_name="multilingual")
```

**支持 4 种模型：**
- `chinese` - 默认
- `multilingual` - 多语言
- `paraphrase` - 长文本
- `sentence` - 短句子

就这么简单！
