查看原文
其他

使用Tmxmall的文档解析API来进行多种类型文档的断句

韩林涛 简言 2022-07-09

背景


这个学期我在教学生怎么开发一个简易的CAT工具(往期成果参见:计算机辅助翻译工具开发竞赛作品展示:小译通),在开发过程中同学们遇到了一个文档解析的难题,即如何能把不同类型的文本都导入到CAT工具并自动完成分句。


这个功能非常不容易开发,但好在一者科技(Tmxmall)的张井、陈件已经把这个功能开发好,并做成API(应用程序接口)了,我们直接调用即可。


在这篇文章中我将简要介绍如何去调用他们的文档解析API。


正文


第一步:了解调用API的简单方法


Tmxmall的文档解析API地址是:


https://www.tmxmall.com/docs/openapi-fileparser/


在这个地址中可以看到这样的说明:


从中可知,文档解析API的作用是:“文档解析API提供了极其简单的编程接口,可以快速解析指定格式的文件,返回从文件中提取的文本和样式数据对象。


我填写了上面的申请表,并很快拿到了所需的信息。


接下来就是去看他们提供的在线文档:



第一次看到这些信息的人会觉得不知所措,但实际上这部分写得非常简洁明了,我给大家解释一下:


知识点一:接口完整路径


其实这里的“接口完整路径”就是一个网址,但是这个网址你不能直接在浏览器访问,如果访问的话会出现下面的错误提示:


可见这不是一个我们常用的网址。


知识点二:请求方式:POST


我们在浏览器中直接输入这个网址并按回车键时,我们就是在“请求”(Request)这个网址。对于程序员来说,要通过写代码的方式来请求,而不是打开浏览器的方式,这时要用“POST”的方式来请求。


简单来说,“POST”就是“寄信”的意思,比如邮局叫“Post office”。


上一步的网址就是“收件人地址”,现在我们要给这个收件人写一封信,信封上除了要注明具体地址外,还要注明一些额外的信息,而信封里则要装入要发送的内容。


在我们现在的这个案例中,我们要发送的内容就是一个要去进行断句操作的文档(比如一个Word文档、一个PDF文档)。


在上面的截图中可知,Tmxmall的文档解析API支持的格式有:“pdf 、doc、ppt、xls、docx、pptx、xlsx、txt、xliff、sdlxlf、xlf、xml、csv、idml、html、htm、md、vsdx、mif、ods、yml、ots、odg、otp、odt、ott、srt、rtf、json、dita、ditamap。


这个文件的大小限制是:“文件大小不超过100M,文件字符数不超过100000字,word文件或excel文件行数不能超过30000行。


这个文件要以“multipart/form-data”方式提交。


知识点三:multipart/form-data


大家平时应该都填写过各种类型的表单吧,当你点击“提交”的那一刻,表单中的数据就会发送出去,而这些数据需要进行编码。一般来说,我们的表单会把数据以两种形式发送:


application/x-www-form-urlencoded

multipart/form-data


如果我们的表单中有要发送的文件,那么就需要使用multipart/form-data,否则就用application/x-www-form-urlencoded


这也是为什么我们在学网页开发基础的时候,当学到上传文件时,会写这样的代码:


<html><body>
<form action="upload_file.php" method="post"enctype="multipart/form-data"><label for="file">Filename:</label><input type="file" name="file" id="file" /> <br /><input type="submit" name="submit" value="Submit" /></form>
</body></html>


在上面的代码中就能看到enctype="multipart/form-data"。


知识点四:请求参数列表


现在你站在邮局里寄信,东西已经转到信封里了,收信人地址也有了,就差在信封上填写一些具体的信息了。这些信息就叫“请求参数”。


在Tmxmall的文档解析API中,我们需要提供以下参数:


file、user_name、client_id、from、to和de。


虽然在上面的截图中已经可以看到每个参数代表的意思,但我还是要再解释一下:


file:这个参数是用户上传的文件,但实际操作过程中并非直接把文件地址放到这个参数里,而是要把文件用multipart/form-data的形式编码后再放进去。


user_name:这个实际上就是你在Tmxmall上注册账号时的邮箱地址。


client_id:这个就是你成功申请到API后对方告诉你的一串密码,这个密码可以在登录账号后直接看到。


from:待解析文档的语言编码。


to:目标语言的语言编码。


在Tmxmall的文档中,简体中文的编码是:zh-CN,美式英文的编码是en-US,注意,不是zh_CN和en_US。


de:调用方,这个可以留空。


有了以上这些基础知识点,我们就可以开始写代码了。


第二步:开始使用PHP来调用API


根据我在本微信公众号中写得往期文章,我接下来依然会在XAMPP这个工具中来使用PHP作为主要编程语言。


我首先启动XAMPP,并在根目录中创建一个名为tmxmall的文件夹。


在该文件夹中,我创建一个名为index.php的文件,并在其中撰写以下代码:


<html><body>
<form action="upload.php" method="post"enctype="multipart/form-data"><label for="file">Filename:</label><input type="file" name="file" id="file" /> <br /><input type="submit" name="submit" value="Submit" /></form>
</body></html>


在浏览器中运行这段代码的效果如下:



也就是说,我们可以直接在这里选择要上传的文件,并点击“Submit”,将这个文件发送到upload_file.php这个文件中。


接下来我们创建upload_file.php文件,并在其中撰写代码来显示上传文件的基本信息:


<?php
if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; }else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Stored in: " . $_FILES["file"]["tmp_name"]; }  ?>


代码来源:

https://www.w3school.com.cn/php/php_file_upload.asp


在上面这段代码中,$_Files["file"]就是我们上传的文件,


$_FILES["file"]["error"]”用于显示文件上传的错误代码。

$_FILES["file"]["name"] ”用于显示文件的名称。

$_FILES["file"]["type"]”用于显示文件的类型。

$_FILES["file"]["size"]”用于显示文件的大小。

$_FILES["file"]["tmp_name"]”用于显示文件的临时存储地址。


有了这其中的一些信息我们就可以开始对文件进行编码了:


在PHP的新版本中有一个函数,名为curl_file_create,可以用于对文件编码,该函数需要三个参数:上传文件的路径、文件的类型和文件名。


对应上面的内容就是:


$_FILES["file"]["size"]”、“$_FILES["file"]["type"]”和“$_FILES["file"]["name"]


所以,我们可以在文件上传后撰写一行代码来对文件进行编码:


<?php
if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; }else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Stored in: " . $_FILES["file"]["tmp_name"]; } $file = curl_file_create($_FILES["file"]["tmp_name"],$_FILES["file"]["type"],$_FILES["file"]["name"]); ?>


信封里的东西包好了,下面就是填写信封上的内容:


$data = array( "file" => $file, "user_name" =>"pkucater@gmail.com", "client_id" =>"97003c01c9e39***********", "to" => "zh-CN", "from" => "en-US", "de" =>"");


我们将所有的参数以数组(array)的形式来存储,并放入变量$data中。


最后一步就是启动调用API的流程,也就是开启“寄信”的操作。


在PHP中,主要是用cURL这个工具来完成的,代码如下:


$url = "http://api.tmxmall.com/v1/http/parseFile";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$output = curl_exec($curl);
curl_close($curl);
echo $output;


其中第一行代码是用于存储文档解析API的地址;


第三行代码用于启动curl工具;


第五行到第九行都是设置工具参数,分别是设置:


CURLOPT_URL:调用地址

CURLOPT_POST:当值为1时即为“POST”方法,并以“multipart/form-data”发送数据

CURLOPT_POSTFIELDS:其参数就是我们要发送的全部参数,即$data

CURLOPT_RETURNTRANSFER:其参数为1时,curl工具不会直接输出调用API的结果

curl_exec():运行curl工具,开始调用API,并将返回的结果放到一个变量中

curl_close():关闭curl工具


接下来我们选择一个简单的txt文件去做一下测试:



上传完成后,我们会看到以下结果:


这一大堆文字看起来很烦人,但是仔细一看会发现原文中的句子都被分割成一句一句的。


也就是说,我们成功调用了Tmxmall的文档解析API!


第三步:从API解析结果中抽取文本并以表格形式呈现


我们获取到的结果是JSON形式的,接下来我们可以将其转换为数组,并使用foreach语句来循环获取所有的结果,逐句显示出来。


代码如下:

$array = json_decode($output,true);
foreach($array["segments"] as $segment){ foreach($segment["srcSegmentAtoms"] as $Atom) { echo $Atom["data"]."<br>"; }}

结果如下:



之所以我们的代码要这样写,实际上需要我们仔细去看Tmmall官方文档中诶出的返回结果的说明:


从上面这些说明可知,所有我们想获取的内容都在srcSegmentAtoms字段的data字段中。


这段代码不光适用于txt文件,如果我把同样的内容放到Word、PPT等文档中,效果是一样的,如下图:


上传一个Word文档:


上传一个PPT文档:



最后,我们再对结果进行一下格式化,将其显示在表格中:


代码:


$array = json_decode($output,true);
echo '<table border="1"> <tr> <th>原文</th> <th>百度翻译</th> <th>有道翻译</th> <th>谷歌翻译</th> </tr>';
foreach($array["segments"] as $segment){ foreach($segment["srcSegmentAtoms"] as $Atom) { echo '<tr><td>'.$Atom["data"].'<td>'; echo '<td></td>'; echo '<td></td></tr>'; }}
echo '</table>';


结果:


大家知道接下来我准备做什么了吗?


有没有想过拿到一个待翻译的文本后,直接先看一下每句话对应的机器翻译的结果是怎样的?


有了这个API,以及之前我讲过的调用机器翻译API的方法(ParaTrans 2.0:百度、有道、搜狗、谷歌四款机器翻译服务大PK!


我们的这种想法就可以实现了。我会在后面的文章中给大家介绍具体的实现方法。


总之,在今天的这篇文章中,我们给大家展示了如何调用Tmxmall的文档解析API,虽然文章写得长,但实际上只需要十几行代码。


最后,向Tmxmall表示感谢,你们真棒!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存