接口说明
SDK目录结构
目录名 | 内容说明 | example |
model |
| ├── model │ ├── alitranxmvf // 模型文件 │ ├── alitranxmvfsse // 模型文件 │ ├── alitranxmvfste // 模型文件 │ ├── alitranxst // 模型文件 │ ├── force.dict.user // 用户自定义术语干预词典 │ └── sent_memory.dict.user // 用户自定义翻译记忆库 ├── lib │ └── libalitranx.en2zh.x86.so // 离线翻译动态库 ├── demo │ ├── demo // 离线翻译demo可执行程序 │ ├── demo_test.in.en // 离线翻译demo测试输入文件 │ ├── index_builder // 用于构建术语干预索引的工具 │ ├── Makefile // 离线翻译demo编译makefile参考 │ ├── trans_demo.cpp // 离线翻译调用demo程序 │ └── translator_interface.h // 离线翻译头文件 └── doc └── readme.pdf // 离线翻译SDK使用说明 |
lib |
| |
demo |
| |
doc |
|
SDK集成流程
-> 3.1 接口参数说明:(详细接口定义在translator_interface.h)
接口名 | 参数名 | 参数类型 | 参数说明 | 是否必须 |
init 初始化接口 | ak_id | string | 授权校验阿里云账号AccessKey ID,获取方式请参见 开通授权 | 是 |
ak_secret | string | 授权校验阿里云账号AccessKey Secret,获取方式请参见 开通授权 | 是 | |
app_key | string | 授权校验Appkey,获取方式请参见 开通授权 | 是 | |
model_path | string | 模型文件路径,需要保证路径下有源语向到目标语向所需要的模型文件 | 是 | |
thread_count | int | 翻译计算的线程数,一般不超过cpu核数,默认为1 | 否 | |
translate 翻译接口 | input | string | 翻译原文 | 是 |
result | string | 翻译译文 | 是 |
-> 3.2 集成步骤:
step1: Load translate library
void*
handle
=
dlopen(trans_lib_path.c_str(), RTLD_LAZY);
step2: Create translator instance
alitranx::CreateTranslatorInsFunc* create_translator_ins =
(alitranx::CreateTranslatorInsFunc*)dlsym(handle, "create_translator");
alitranx::TranslatorInterface* translator = create_translator_ins();
step3: Init translator
translator->init(ak_id, ak_secret, app_key, model_path, thread_count);
step4: Do translate
translator->translate(input, result);
step5: Destroy translator
alitranx::DestroyTranslatorInsFunc* destroy_translator_ins =
(alitranx::DestroyTranslatorInsFunc*)dlsym(handle, "destroy_translator");
step6: Close translate library
dlclose(handle);
step7: Compile
g++ -std=c++11 demo.cpp -O3 -lpthread -ldl -o demo
-> 3.3 demo程序参考:
#include <iostream>
#include <fstream>
#include <dlfcn.h>
#include <vector>
#include "translator_interface.h"
int main(int argc, char* argv[]) {
if (argc != 7) {
std::cout << "Arguments Error! You must give six arguments!" << std::endl;
std::cout << "argument 1: ak_id. eg: ABCD" << std::endl;
std::cout << "argument 2: ak_secret. eg: ABCD" << std::endl;
std::cout << "argument 3: app_key. eg: ABCD" << std::endl;
std::cout << "argument 4: model_path. eg: ./model" << std::endl;
std::cout << "argument 5: the path for lib. eg: ../lib/libalitranx.en2zh.x86.so" << std::endl;
std::cout << "argument 6: the path for test_input_file. eg: ./demo_test.in" << std::endl;
return -1;
}
std::string ak_id = argv[1];
std::string ak_secret = argv[2];
std::string app_key = argv[3];
std::string model_path = argv[4];
std::string trans_lib_path = argv[5];
std::string test_file_path = argv[6];
// step1: Load translate library
void* handle = dlopen(trans_lib_path.c_str(), RTLD_LAZY);
if (!handle) {
std::cout << "dlopen " << trans_lib_path << " failed" << dlerror();
return -1;
}
// step2: Create translator instance
alitranx::CreateTranslatorInsFunc* create_translator_ins =
(alitranx::CreateTranslatorInsFunc*)dlsym(handle, "create_translator");
char* dlsym_error = dlerror();
if (dlsym_error) {
std::cout << "create_translator_ins dlsym error, " << dlsym_error << std::endl;
return -1;
}
alitranx::TranslatorInterface* translator = create_translator_ins();
int thread_count = 2;
// step3: Init translator
if (translator->init(
ak_id,
ak_secret,
app_key,
model_path,
thread_count) == false) {
std::cout << "Init Failed" << std::endl;
return -1;
}
std::ifstream in;
in.open(test_file_path, std::ios::in);
if (!in.is_open()) {
std::cout << "open test file fail, path: " << test_file_path << std::endl;
return -1;
}
std::vector<std::string> inputs;
std::string line;
while (getline(in, line)) inputs.push_back(line);
in.close();
// step4: Do translate
for (auto input : inputs) {
std::string result;
if (translator->translate(input, result) == false) {
std::cout << "translate failed for input: " << input << std::endl;
return -1;
}
std::cout << result << std::endl;
}
// step5: Destroy translator
alitranx::DestroyTranslatorInsFunc* destroy_translator_ins =
(alitranx::DestroyTranslatorInsFunc*)dlsym(handle, "destroy_translator");
dlsym_error = dlerror();
if (dlsym_error) {
std::cout << "destroy_translator_ins dlsym error, " << dlsym_error << std::endl;
return -1;
}
destroy_translator_ins(translator);
// step6: Close translate library
dlclose(handle);
return 0;
}
SDK用户翻译干预
自定义翻译记忆库干预
翻译记忆库功能允许用户自行上传翻译原文和给定的译文,当翻译系统接收到的输入已经存在于翻译记忆库中时,翻译系统会不进行机器翻译, 而是直接返回翻译记忆中的译文。翻译记忆库的文件位置model/sent_memory.dict.user,其内容格式为:原文\t译文。修改完该文件后,重新初始化SDK即可生效。
自定义术语干预
术语干预的文件位置为model/force.dict.user,其内容格式为:术语原文\t译文。当用户需要更改术语时,可以按照该格式准备好文件替换原先路径下的force.dict.user,然后通过SDK自带的索引构建工具demo/index_builder构建干预索引,构建完成后,重新初始化SDK生效。
注意:
a. 每个SDK都在demo目录里有专属对应的索引构建工具,并不适用于其他SDK.
b. 修改的术语文件必须要构建索引才能生效。
c. 术语干预的原理为通过给定术语译文与原机翻译文的对比和计算,让术语翻译出现在机翻译文中,视机翻译文和原译文的差异大小,有可能会导致干预后结果存在错乱; 此外,术语干预仅适用于专有实体名词,对于其他类别的词进行干预也有可能存在造成一定的翻译错乱问题。