522a3964
tangwang
多语言搜索翻译的优化(deepL添...
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
|
# DeepL 翻译优化指南
## 问题描述
在电商搜索环境中,DeepL 翻译可能会遇到多义词翻译不准确的问题。例如:
- "车" 被翻译为 "rook"(象棋中的车)而不是 "car"(汽车)
## 解决方案
我们实现了以下优化方案来改善 DeepL 在电商场景下的翻译准确性:
### 1. 上下文提示(Context Hints)
系统会自动为单字查询添加电商上下文,帮助 DeepL 理解查询的领域。
**工作原理:**
- 对于中文单字查询(如 "车"),系统会自动添加上下文 "购买 车"
- DeepL 会根据上下文将 "车" 翻译为 "car" 而不是 "rook"
- 翻译完成后,系统会自动提取实际的查询词("car")
**配置:**
在 `config/config.yaml` 中可以设置翻译上下文:
```yaml
query_config:
translation_context: "e-commerce product search" # 默认值
```
### 2. 术语表(Glossary)支持(推荐方案)
DeepL 支持使用自定义术语表来确保特定词汇的准确翻译。这是解决多义词问题的最佳方案。
#### 创建术语表
1. **使用 DeepL API 创建术语表:**
```python
import requests
# 创建术语表
api_url = "https://api.deepl.com/v2/glossaries"
headers = {
"Authorization": "DeepL-Auth-Key YOUR_API_KEY",
"Content-Type": "application/json",
}
# 术语表内容(TSV 格式)
glossary_entries = """车\tcar
手机\tmobile phone
电脑\tcomputer"""
payload = {
"name": "e-commerce-glossary",
"source_lang": "ZH",
"target_lang": "EN",
"entries": glossary_entries,
"entries_format": "tsv"
}
response = requests.post(api_url, headers=headers, json=payload)
if response.status_code == 201:
glossary_id = response.json()["glossary_id"]
print(f"术语表创建成功,ID: {glossary_id}")
```
2. **或者使用 DeepL 网页界面创建:**
- 登录 DeepL Pro 账户
- 进入术语表管理页面
- 创建新的术语表,添加 "车" -> "car" 等映射
#### 配置术语表
在 `config/config.yaml` 中配置术语表 ID:
```yaml
query_config:
translation_glossary_id: "your-glossary-id-here" # DeepL 术语表 ID
```
#### 术语表格式
术语表使用 TSV(Tab-Separated Values)格式,每行一个词条:
```
车 car
手机 mobile phone
电脑 computer
```
**注意:**
- 术语表功能需要 DeepL Pro 账户(付费版)
- Free API 不支持术语表功能
### 3. 自动上下文处理
系统会自动检测以下情况并应用优化:
- **单字中文查询**:自动添加电商上下文
- **多字查询**:DeepL 通常有足够的上下文,无需特殊处理
- **非中文查询**:不应用上下文优化
## 使用示例
### 示例 1:使用上下文提示(自动)
查询 "车" 时:
1. 系统检测到这是单字中文查询
2. 自动添加上下文:"购买 车"
3. DeepL 翻译为 "buy car"
4. 系统提取实际查询词:"car"
### 示例 2:使用术语表(推荐)
1. 创建术语表,包含 "车" -> "car" 的映射
2. 在配置中设置 `translation_glossary_id`
3. 查询 "车" 时,DeepL 直接使用术语表翻译为 "car"
## 最佳实践
1. **优先使用术语表**:
- 对于常见的电商术语,创建术语表是最可靠的方案
- 术语表可以确保翻译的一致性和准确性
2. **上下文提示作为补充**:
- 对于未在术语表中的词汇,上下文提示可以提供帮助
- 系统已默认启用,无需额外配置
3. **定期更新术语表**:
- 根据实际使用情况,不断添加新的术语映射
- 特别是品牌名、产品类别等专业术语
## 技术实现细节
### 上下文添加逻辑
```python
# 对于单字查询(长度 <= 2 个字符)
if len(text.strip().split()) == 1 and len(text.strip()) <= 2:
context_phrase = f"购买 {text}" # 添加 "购买" 前缀
return context_phrase, True # 需要从结果中提取
```
### 结果提取逻辑
翻译结果 "buy car" 会被处理:
1. 识别上下文词(buy, purchase, product 等)
2. 提取非上下文词作为实际查询词
3. 返回 "car"
## 常见问题
### Q: 为什么 "车" 会被翻译为 "rook"?
A: DeepL 在处理单字查询时,缺乏上下文来判断词义。"车" 在中文中既可以指汽车,也可以指象棋中的车。通过添加电商上下文或使用术语表,可以解决这个问题。
### Q: 术语表和上下文提示哪个更好?
A: 术语表是更可靠的方案,因为它直接指定了翻译映射。上下文提示是自动的补充方案,适用于未在术语表中的词汇。
### Q: Free API 可以使用术语表吗?
A: 不可以。术语表功能需要 DeepL Pro(付费版)账户。Free API 只能使用上下文提示优化。
### Q: 如何测试翻译效果?
A: 可以通过搜索 API 测试翻译结果,查看返回的 `translations` 字段:
```bash
curl -X POST http://localhost:6002/api/search \
-H "Content-Type: application/json" \
-d '{"query": "车", "tenant_id": "test"}'
```
## 相关文件
- `query/translator.py` - 翻译器实现
- `query/query_parser.py` - 查询解析器(调用翻译器)
- `config/config.yaml` - 配置文件
- `config/config_loader.py` - 配置加载器
## 参考资源
- [DeepL API 文档](https://www.deepl.com/docs-api)
- [DeepL 术语表功能](https://www.deepl.com/docs-api/managing-glossaries/)
|