语言检测
Discuse 会识别消息的语言,以便你在采取操作前应用合适的审核规则。将文本发送到启用 check_language 的 POST https://api.discuse.com/api/v2/check,并从 results.language.language 读取检测到的语言代码。添加 expected_language 可标记不符合你要求语言的内容。
语言检测有什么用?
预先检测语言可以让你:
- 应用特定语言的审核阈值
- 将内容分配给合适的审核人员或支持团队
- 执行社区语言政策
- 按语言筛选或本地化信息流
如何检测语言?
curl -X POST https://api.discuse.com/api/v2/check \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{
"content": {
"text": "Bonjour, comment allez-vous aujourd'\''hui?"
},
"settings": {
"check_language": true
}
}'
响应格式
{
"has_violations": false,
"cached": false,
"results": {
"language": {
"language": "fr",
"confidence": 0.99,
"hit": false
}
}
}
检测到的语言代码位于 results.language.language。启用 expected_language 强制校验后,detected 和 expected 也会被填充(见下文)。
语言结果会返回哪些字段?
| 字段 | 类型 | 含义 |
|---|---|---|
language |
string | 检测到的语言代码(例如 en、fr、es) |
confidence |
number | 检测置信度(0.0–1.0) |
expected |
string | 设置 expected_language 时强制要求的语言代码 |
detected |
string | 检测到的代码(language 的别名,在强制校验期间填充) |
hit |
bool | 当检测到的语言与 expected 不匹配时为 True |
delete_only |
bool | 为 true 时,消息应被删除且不再进一步处罚 |
error |
string | 仅在检测失败时出现 |
支持哪些语言?
Discuse 返回 ISO 风格的语言代码。常见可检测语言包括:
| 代码 | 语言 | 代码 | 语言 |
|---|---|---|---|
en |
英语 | de |
德语 |
es |
西班牙语 | fr |
法语 |
it |
意大利语 | pt |
葡萄牙语 |
nl |
荷兰语 | pl |
波兰语 |
ru |
俄语 | uk |
乌克兰语 |
zh |
中文 | ja |
日语 |
ko |
韩语 | ar |
阿拉伯语 |
hi |
印地语 | tr |
土耳其语 |
请直接从 results.language.language 读取值,而不是硬编码固定列表。
如何强制要求特定语言?
将 expected_language 设置为你要求的代码。当检测到的语言不一致时,language.hit 为 true,并且会填充 expected/detected:
请求:
{
"content": { "text": "Hola, cómo estás?" },
"settings": {
"check_language": true,
"expected_language": "en"
}
}
响应:
{
"has_violations": true,
"message": "Content is not in expected language",
"results": {
"hits": true,
"language": {
"language": "es",
"detected": "es",
"expected": "en",
"confidence": 0.97,
"hit": true
}
}
}
使用场景
仅限英语的论坛
async function validatePost(post) {
const result = await fetch('https://api.discuse.com/api/v2/check', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.DISCUSE_API_KEY
},
body: JSON.stringify({
content: { text: post.content },
settings: { check_language: true, expected_language: 'en' }
})
}).then(r => r.json());
if (result.results.language.hit) {
return {
approved: false,
reason: 'Posts must be in English',
detected_language: result.results.language.language
};
}
return { approved: true };
}
多语言路由
async function routeContent(content) {
const result = await checkLanguage(content.text);
const language = result.results.language.language;
const moderatorQueue = {
en: 'english-moderation',
es: 'spanish-moderation',
fr: 'french-moderation',
de: 'german-moderation',
default: 'general-moderation'
};
const queue = moderatorQueue[language] || moderatorQueue.default;
await addToQueue(queue, content);
return { queued: true, language };
}
与内容审核结合使用
在一次请求中同时运行语言检测、情绪分析和垃圾内容检测:
{
"content": {
"text": "User message in any language"
},
"settings": {
"check_language": true,
"check_sentiment": true,
"check_spam": true
}
}
随后可以根据检测到的语言驱动你的分语言情绪阈值:
const LANGUAGE_THRESHOLDS = {
en: { toxicity: 0.7, profanity: 0.6 },
de: { toxicity: 0.6, profanity: 0.5 },
es: { toxicity: 0.7, profanity: 0.7 },
default: { toxicity: 0.7, profanity: 0.6 }
};
async function moderateContent(text) {
const result = await checkText(text); // check_language + check_sentiment
const language = result.results.language.language;
const thresholds = LANGUAGE_THRESHOLDS[language] || LANGUAGE_THRESHOLDS.default;
const sentiment = result.results.sentiment;
if (sentiment.toxicity > thresholds.toxicity) {
return { action: 'block', reason: 'toxic_content' };
}
if (sentiment.profanity > thresholds.profanity) {
return { action: 'flag', reason: 'profanity' };
}
return { action: 'allow' };
}
最佳实践
考虑短文本的情况
对非常短的字符串,检测结果不太可靠。低于最小长度时可跳过检查:
async function smartLanguageCheck(text) {
if (text.length < 20) {
return { language: 'unknown', confidence: 0 };
}
const result = await checkLanguage(text);
return result.results.language;
}
缓存结果
async function getLanguageWithCache(text, contentId) {
const cached = await cache.get(`lang:${contentId}`);
if (cached) return JSON.parse(cached);
const result = await checkLanguage(text);
const language = result.results.language;
await cache.set(`lang:${contentId}`, JSON.stringify(language), 'EX', 3600);
return language;
}
使用限制
语言检测会消耗你的文本分析配额:
| 套餐 | 每月分析次数 |
|---|---|
| Basic | 1,000 |
| Gold | 5,000 |
| Platinum | 15,000 |
| Ultimate | 30,000 |
缓存响应不会计入你的配额。
集成示例
Node.js
const checkLanguage = async (text, expectedLanguage = null) => {
const settings = { check_language: true };
if (expectedLanguage) settings.expected_language = expectedLanguage;
const response = await fetch('https://api.discuse.com/api/v2/check', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.DISCUSE_API_KEY
},
body: JSON.stringify({ content: { text }, settings })
});
return response.json();
};
Python
import os
import requests
def check_language(text, expected_language=None):
settings = {'check_language': True}
if expected_language:
settings['expected_language'] = expected_language
response = requests.post(
'https://api.discuse.com/api/v2/check',
headers={
'Content-Type': 'application/json',
'X-API-Key': os.environ['DISCUSE_API_KEY']
},
json={'content': {'text': text}, 'settings': settings}
)
return response.json()