xulihang's blog 2019-04-13T14:58:10+00:00 xulihanghai@163.com 软件著作权的申请 2019-04-13T14:34:50+00:00 xulihang blog.xulihang.me/software-copyright-application BasicCAT虽然是开源软件,但还是申请了国内的软著保护自己的权利。软著其它的用处还有可以申请国家高新企业、满足国内安卓市场上架要求、然后学术上算是一个成果。软著的申请花了我不少时间,我也稍微记录一下。

作品版权和软件著作权是由中国版权局进行审核和登记的,软件主要的登记流程是去官网在线填写登记表,打印出来,并准备软件文档、代码、身份证复印件,把资料送到版权局。

版权局在各大城市有几个分理处,但华东地区只收华东地区户口的申请人的申请,而北京接受全国的。如果不能亲自送,可以邮寄。

版权局的官网网站只支持IE浏览器,网站上有软件登记的具体说明和邮寄地址。

这里讲一些注意事项:

  1. 软件的全称应该以软件和系统结尾,比如BasicCAT计算机辅助翻译软件。
  2. 程序语言应该填写常见的,比如Java、Basic,冷门的可能不通过。
  3. 注意代码和文档,要求单面打印,页眉是软件全称和版本号,右上角要求标页码。
  4. 申请表中著作权人栏目中省份城市应与身份证上面的地址一致。

我申请了三次,一次寄到北京被要求补正,一次去上海的华东版权大厅被告知北京户口不能在华东办理,最后在1月7日在线登记然后把资料寄到北京,2月20日审核通过并进行受理,4月2日复审通过并登记。所以邮寄过去,不加急的话大概等三个月。

版权登记现在还在用纸质材料,希望以后能不用邮寄材料,完全通过在线的方式提交,然后审核的话,先机器自动检测一下提交的材料是否正确,如果正确最好能够直接通过,不正确就给出修改意见,这样会方便很多。当然,如果全自动了,版权局的不少同志可能就清闲了。

]]>
那些译者的故事 2019-04-09T11:46:50+00:00 xulihang blog.xulihang.me/stories-of-translators 本文主要收集含有翻译笔记、感想之类内容的译者博客,并给出一些文章示例。

]]>
你想出名吗 2019-04-06T14:02:50+00:00 xulihang blog.xulihang.me/do-you-want-popularity 你想出名吗?我想人们应该都想出名,让自己被别人知道。但是,出名后的生活会更快乐吗?

出名后作为公众人物,影响力大了,要负起更多责任。同时,出名后就没有那么自由了,出门会被人认出来,是明星的话还要服从公司的安排,衣着和言行都要注意。

再说软件开源,本来只是一个不知名的项目,开发者一个人维护的。突然,这个项目得到了很多的关注,很多人参与了进来,那这个时候,原来的维护者会有很大的压力。另外,有了别人的参与,自己对项目的掌控或多或少就不自由了。有人能给代码做帮助是很好的,但也怕有人水平不够,反而带来了困扰(参见:我为什么不再公开开发Yin语言)。

其实,事物的发展是螺旋式上升的,一个阶段有一个阶段的特点。成名前的生活可能更无忧无虑,而成名后可以凭借自己的影响力做更多有意义的事情。做好自己,找到不同阶段的快乐,如果有机会成名,就把握住机会。

这篇文章的动因是我看了杨超越的经历,发现在18线女团CH2时,超越过得还是挺快乐的,但是参加创造101后,明显承受了不少压力。这时,用粉丝的话说应该就是,回不去了,就快点长大吧。

其实,对于大多数人,没有成名,在一个小众的圈子里可以过得很好。CH2当初定位高校偶像女团,受众主要是大学生。我前面的一篇博文,讲的小众编程语言,B4X的用户一般都是个人开发者,有很多非专业出身的用户,也有很多资深的程序员用户,因为圈子小,讨论的氛围好,学习的资料也比较清楚。hi-pda论坛,主要针对电子书用户,采用邀请注册,做小而精的论坛。

但是小众的坏处就是影响面小,有时候会缺少经济支持,这个问题也是自古就存在的。所以,人内心深处,应该多少都是渴望成名的吧。

]]>
小众编程语言 2019-04-06T12:54:50+00:00 xulihang blog.xulihang.me/minority-programming-language 最近每天会看很多实习生招聘的描述。技术类的岗位,前端一般要求掌握HTML、CSS和JS,常用的框架之一,比如Vue、React和Angular,然后最好还会webpack等工具。后端一般用Java,要求掌握Spring框架,还有Mybatis。大数据一般要求会SQL,Hadoop、Elasticsearch等。而机器学习,除了掌握原理,也要求掌握主流框架,比如TensorFlow、PyTorch等。

一般公司要求实习生掌握主流的语言,比如C\C++、Java、Python、PHP还有最近流行起来的Go等。作为公司的软件,需要有一个团队进行合作,选择学的人多的容易招人,招到的实习生来了不用怎么培训,做的工作也容易交接。当然,也有公司使用冷门的语言,比如Grammaly,使用Common Lisp开发的后端。但它也用别的语言,采用微服务的形式,把不同语言开发的产品结合起来。

主流公司都要使用主流的语言,那小众语言的存在价值是什么呢?这个世界是多样化的,程序语言也同样是各式各样的,满足不同群体的需要。比如Lisp是函数式编程语言、R用于统计、Erlang用于开发容错性高的产品、Scratch是图形化编程。而B4X是可以用一种Basic风格的语言做到跨平台原生软件的开发。

B4X是我最熟悉的编程工具是一款小众产品,圈子不大,但好在社区活跃,开发者也很勤奋。B4X使用的Basic语言非常容易学习,而且IDE功能很强大,安装也方便,入门容易,深入学习也不难。其实B4X只是把Basic语言进行转译,转译为Java、Objective-C这样的主流语言,可以使用这些语言的类库,可以说是站在了主流语言的肩膀之上的一款小众产品。

针对个人开发者或是小团队,其实B4X非常实用,开发高效,一种语言完成多个平台的开发。B4X的B4XSerializator库可以把不同平台的数据类型以二进制的形式存储,要用时可以转为平台的原生数据类型,类似于Protobuf。除了UI部分,其它Basic语言写的代码基本可以共享。

编程的主要目的是解决问题,使用哪种语言其实并不重要,重要的是找到合适的语言和工具。

如果你的目的是进入大公司,应该学习主流语言。如果,你想用编程开发小软件,解决自己工作的问题,或者做一个自由职业者,那选择什么语言是比较自由的。如何选择语言,可以看看这篇文章:我该学习哪门编程语言

]]>
技术传播领域的工具 2019-04-03T08:09:50+00:00 xulihang blog.xulihang.me/tech-comm-tools 技术传播的工具其实和常见的桌面出版工具有很多相似之处,不过主要的功能是用来写技术文档。技术传播者主要的工作应该是创造内容,但是我们往往会花费很多时间在工具的学习。而且,现在可以选择的工具真是太多了。现在,我打算做一个收集,并做简单的介绍。

商业软件

商业软件一般提供了很好的集成式的软件环境,用户只需要注重内容的写作。它们一般都支持DITA等基于XML格式的标准,支持所见所得的方式进行编辑,也可以切换到代码编辑模式,支持从单一文件生成多种目标格式。商业软件一般都宣传自己简单易用,用户支持好,相较免费软件,学习成本较低。

Oxygen XML Editor

从名字可以看出,Oxygen是一款XML编辑器,在技术写作方面主要和DITA、Docbook等标准配合使用。它的界面清爽,可视化编辑工作做得不错。基于DITA-OT,它可以从DITA文件生成很多目标格式的成品文档。它的帮助文档也做得很丰富。

Adobe Framemaker

Framemaker最近几年一直在推基于DITA的结构化文档。相比于以前像Word一样基于样式的,比较自由的方式,结构化的写作对使用的元素有严格要求。内容都是存储在结构化的元素里,用户不用管样式,更多的是要管用什么元素,元素有什么属性。

Framemaker有三种视图模式:XML View、Author View和WYSWYG View。XML模式就是XML代码编辑模式,这时菜单也会相应改变,添加XPath、XSLT等操作。WYSWYG View就是所见即所得模式,内容会被预览为一个A4 PDF的内容,有一个窗口,可以显示文档的结构。Author View也是所见即所得的,不过更像Word里的Web视图。

使用Framemaker可以打开上面Oxygen的示例文件,因为都是基于DITA,可以在两个软件中操作,不过Oxygen使用的一些自定义元素,比如修订用到的元素,就没有效果了。

Framemaker也算是一款老牌的商业软件,但是国内的教程很少,有的话大多是很早之前的了,所以只有看官方文档。这个视频介绍得不错:https://my.adobeconnect.com/structuredframemaker17/

另外还有官方推荐的免费的入门教程:https://courses.techcommtools.com/p/fm2019intro/

Framemaker属于Adobe的技术传播套件(Technical Communication Suite),套件里还有RoboHelp、Captivate、Acrobat等其它组件。Robohelp和madcap比较类似,更简单易用,captivate专注电子学习,acrobat是专业的PDF编辑软件。

MadCap Flare

MadCap Flare并不采用DITA,而是使用了自己的一套类似html的xml格式,文件名都是htm。它也是基于主题(topic)和同源开发(single sourcing)的概念设计的。它支持导入framemaker、robohelp或者dita的项目文件,把这些文件转换为自己格式的文件。

这是一个madcap项目的结构,可以感受一下:

C:.
│  AllAboutSanDiego.htm
│  Beer.htm
│  Food.htm
│  Home.htm
│  SanDiegoAttractions.htm
│  SanDiegoCuisine.htm
│  
├─PrintOnlyTopics
│      Copyright.htm
│      PrintTOC.htm
│      Resources.htm
│      TitlePage.htm
│      
└─Resources
    ├─Images
    │      balboapark.png
    │      balboapark.png.props
    │      Bullet1.png
    │      
    ├─MasterPages
    │      HomePage.flmsp
    │      OtherTopics.flmsp
    │      
    ├─PageLayouts
    │      Chapters.flpgl
    │      Copyright.flpgl
    │      
    ├─Stylesheets
    │      MainStyles.css
    │      StylesForHomePage.css
    │      
    └─TableStyles
            BasicAlternateRows.css
            Simple.css

其实就相当于下一部分会提到的jekyll,提供一套主题,然后用户基于这套主题添加和管理内容。madcap使用起来并不是很直观,而且会被限制在它这个环境。

与Madcap Flare配套的还有一系列软件,比如Madcap lingo,是类似于SDL Trados的计算机辅助翻译软件,可以用来翻译madcap flare的项目。

使用上述这类商业软件,初次使用也还是需要花挺多时间摸索的。不过它们都有共通性。比如都有Index、Glossary,都是基于主题的,都可以给输出进行各种参数的设置。商业软件使用的格式不同,但基本可以互操作。

开源软件

开源软件更加丰富,而且衍生出一整套工具链和方法。一般采用的方法是docs-as-code,文档即代码,用写代码的方式写文档。

程序员应该更加喜欢这类模式:可以使用免费的称手的编辑器,比如visual studio code;使用简易化的标记语言,比如markdown、restructuredText、asciidoc;还可以用git来进行版本控制和团队协作,不需要复杂的CMS系统。

其实程序员写代码时,就通常把文档写在代码里。于是就产生了把用来说明程序的类、函数的内容,自动提取出来生成API文档的工具,比如Python语言有Sphinx,Java有javadoc,C有Doxygen。

另外还有一种API,是REST API,主要是一些网络接口,和上面提的API不一样,也有专门的工具,叫Swagger。

这样的方式对技术传播人员提高了要求,要掌握一些编程工具。

文档需要有发布机制,也要能像商业软件和DITA一样,从单个文件格式发布到多种目标格式。上面提到的Sphinx、javadoc和doxygen都能将内容以网页的形式发布。Sphinx支持的格式更多,PDF、网页、LaTeX等都能支持。

另外,现在也流行静态网页生成器,比如jekyll,可以基于liquid语法定制一套主题,自动从配置文件、markdown文件生成网站。

有一篇讨论doc like code的主题演讲博客,可以看一下:https://idratherbewriting.com/2018/03/09/docs-as-code-tools-and-workflows-denver-presentation/,里面提到了如何解决文档即代码模式缺少的传统DITA模式具有的内容重用等功能。

对于DITA和docbook,可以选择vim之类的编辑器,或者专门的XML编辑器,比如XML Copy Editor,来编写XML,然后使用对应的工具生成文档。

另外还有man page等等,就不提了。

在线软件

分为传统CMS和基于git类服务的系统。

在线CMS系统:

  • easyDita
  • SDL Tridion Docs

docs-as-code:

  • read the docs,sphinx项目的托管平台
  • GitHub,一般都用GitHub托管git项目
  • Gitbook,用git+markdown来写作,有一套自己的工具链

其它

还有很多传统的文档格式,比如Windows的HLP、CHM格式,也有新兴的ePub格式,这类本质都是基于html技术实现的。上面提到的软件基本都能生成这类格式的目标文件。

一些工具:

  • easyCHM
  • Calibre

另外,除了文本,帮助文档还可以以音视频、虚拟现实、增强现实和聊天机器人等新的方式存在,这样涉及的工具就更多了。

]]>
文摘 2019-03-31T11:38:50+00:00 xulihang blog.xulihang.me/articles-digest 学习阮一峰的每周分享,把看到的文章摘录下来。不过我不会每周更新,只是统一在一篇文章里进行收录。讲技术细节的文章不做整理,主要是一些议论文类的。

Do the right thing, Wait to get fired

原文:https://brendansterne.com/2013/07/11/do-the-right-thing-wait-to-get-fired/

招聘网站Indeed创办人Brendan Sterne的一篇文章,引起了热议。引用的谷歌员工的话如下:

New Google employees (we call “Nooglers”) often ask me what makes me effective at what I do. I tell them only half-jokingly that it’s very simple: I do the Right Thing for Google and the world, and then I sit back and wait to get fired. If I don’t get fired, I’ve done the Right Thing for everyone. If I do get fired, this is the wrong employer to work for in the first place. So, either way, I win. That is my career strategy.

意思是这个员工能力很好,他会选择做对公司和世界都有用的东西。如果公司没有开除他,说明他的确做对了。如果开除了他,说明这家公司并不是一家好公司。大公司里有一套约束人的制度,要求员工遵守。但他们又希望员工能打破常规,带来点新的东西。

在我看来,有时员工新入职时就有改变公司,改变世界的雄心,但大型企业存在的复杂规则有它存在的道理,在没有彻底了解的情况下想实现自己的理想是不容易的。如果不想花很久时间来搞清这套规则,可以先去制度简单的公司。这个在外企当过实习生的我也是深有体会。

人存在的意义

原文:《存在主义心理治疗》读书笔记

存在主义理念把世界看作是偶然的,也就是任何事情都可能是另一副样子。人构成了自身、自己的世界以及在这个世界中自身所处的情境。不存在“意义”。在宇宙中没有宏大的设计,没有指导生活的原则,除非个体自己创造这些原则。因此,最根本的问题变成了:需要意义的个体如何在一个没有意义的世界中找到意义?

《存在主义心理治疗》这本书本身比较晦涩难懂,我关心的是人存在的意义到底是什么。人存在的意义其实是自己定义的。在生活中,我们可以通过帮助别人、实现自己的目标等方式来获得意义感。忙碌起来,有意义感,焦虑也会减少,这样心理疾病就可以得到治疗。

]]>
将各种格式文件转换为纯文本内容 2019-03-24T08:43:50+00:00 xulihang blog.xulihang.me/convert-files-to-plain-text 一个搜索引擎要检索文件的内容,首先要把提取它的纯文本内容。

Apache Tika就是这样一个工具,它可以提取doc、docx、pdf等格式文件的文本内容。

使用Tika facade,可以完成提取文本的操作:

import java.io.File;
import java.io.IOException;

import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;

public class TikaExtraction {
    
   public static void main(final String[] args) throws IOException, TikaException {

      //Assume sample.txt is in your current directory              
      File file = new File("sample.txt");
      
      //Instantiating Tika facade class
      Tika tika = new Tika();
      String filecontent = tika.parseToString(file);
      System.out.println("Extracted Content: " + filecontent);
   }         
}

以上代码来自:https://www.yiibai.com/tika/tika_content_extraction.html

Tika还支持处理音视频,提取元数据。

不过Tika也有不支持的文件,比如idml格式的文件。这时,可以选择okapi的tikal,把文件转换为xliff后再提取xliff的纯文本内容。

我制作了这样的一个把各种文件提取为纯文本的web工具all2txt,代码在此:https://github.com/xulihang/all2txt

]]>
CAT术语大全 2019-03-24T08:41:50+00:00 xulihang blog.xulihang.me/cat-glossary 这篇文章翻译自memoQ的产品经理Gabor的The ultimate CAT tool jargon buster,已经得到了作者的翻译许可。

本文使用BasicCAT翻译,大部分内容都是基于百度翻译做的译后编辑,基本保留原文的句式和内容,除了一些拗口的地方,我进行了意译。翻译此文的目的是普及CAT基础知识,统一CAT的用语,有不对的地方欢迎指出。

目录

译文

CAT术语大全

2017年5月16日

精心挑选的150个术语,涵盖各种表达和缩写,帮助你深入了解CAT工具。

免责声明

我编写这份词汇表主要是出于自己的爱好(是的,我知道,我的爱好有点奇怪),同时也是为了帮助那些试图快速了解翻译行业术语的人。作为一群开发CAT软件,致力于帮助人们交流的人,我们确实创造了很多专业领域的词汇,是吧?

希望读者不要完全相信本文的内容。很多都只是我的一面之词,而且我还是memoq的员工。客观地说,memoQ是世界上最棒的CAT工具。但我会尽量做到内容和具体的工具无关。我加入了尽可能少的memoQ术语,不过我没有用到其它工具的术语。我只是觉得我对于其它工具并不了解,也没有这个权威性,对于未知领域要保持谨慎。

如果你喜欢本文,欢迎分享给你的朋友、同事和对手。如果你发现任何错误或者不准确的地方,可以选择你喜欢的沟通方式给我反馈。

激活(activation)

激活一般需要访问制造商的网站。本地程序向远程网站发送一串序列号以及关于你计算机的一些匿名信息。如果你拥有证书或者选择的试用版,网站就会返回一串代码,授权程序在你的电脑上运行。

另见:CAL许可证(CAL License)

对齐(alignment)

一般在收到一份要翻译的文件时,你还会收到很多之前翻译过的文件和对应的原文,或者在网络上能找到匹配的内容。这些文件内容很大程度可以用作翻译记忆使用,在模糊匹配和检索时发挥作用。问题是,翻译记忆是对齐了的句段,而你现在有的是整个文档。对齐指将源文档和目标文档拆分成片段,并利用算法找出目标片段对应于哪个源文片段。这可不是一件简单的事!高级CAT软件可以做到大致的句段自动对齐,并帮助你修正对齐错误的句段。

另见:LiveAlign

分析(analysis)

在你接受一份任务前,你需要知道有多少文本需要翻译。你已经有了存储已有翻译的翻译记忆,所以您还想知道有多少新的文本需要翻译,有多少模糊匹配和精确匹配。这就是分析所做的:它对要翻译的文本和翻译记忆与语料库中的文本进行比对,并给你一个清晰的统计结果,包括句段、词和字符数。

“分析”有时也可以和“统计”这个词互换使用,在这种情况下,统计并不是一门高深的学科。

应用程序编程接口(API)

一个计算机术语,指一个程序允许其它程序通过某种方式使用它的功能,就像用户通过点击按钮来使用程序。如果一个程序没有API,那么它就不能与其它系统集成,用户最终会因为大量完全不必要的点击而患上肌腱炎。确保你考虑的基于云的工具提供API,这一点尤为重要。如果不提供,你就没有获得你的数据并和其它程序进行数据交换的简便方法。

在服务器上自动保存(auto save on server)

当你在一个memoQ在线项目中工作时,你的翻译最初只保存在你的计算机上。您可以选择每天进行几次同步。如果启用自动保存,在保存时,你的翻译将立即发送到服务器,且不会耽误你的工作。这样别人就可以看到你的工作,且*几乎*就像你在实时编辑一个谷歌文档。有什么比这更好的方法来保持翻译的一致性?

自动检索(automatic concordance)

如果你想知道某个表达是怎么翻译的,你可以使用检索(concordance)功能。但是一个好的CAT工具可以做得更多:它可以搜索到在许多句段都存在的内容,并进行高亮。这就像是在说,“嘿!这些短语似乎到处都是,马上对它们进行检索可能是个好主意!”如果你非常幸运,这些短语还作为整个原文句段出现,这样可以自动调用翻译记忆或语料库进行翻译。

AutoPick

我不知道各位读者是不是也是这样,我不喜欢在翻译的时候输入数字,我也不喜欢在中途从原文复制一段内容到译文。除了数字,原文句段中还会包含其它需要直接复制到译文的内容,比如标签、非译元素和一些术语。在memoQ中,如果你按下并释放CTRL键,它的AutoPick功能会列出所有原文中的这些特殊内容,你可以用方向键来选择内容,把它们插入到译文中。它还能重新格式化数字以匹配目标语言的格式。

自动填充(auto-propagation)

需要翻译的文本基本上都有重复。很多片段会出现多次。在一些技术文本中,重复片段的比例会更高。翻译记忆的一个作用就是能重复利用翻译过的内容。不过CAT工具可以做得更好。如果你启用了自动填充,那么确认一个句段后,工具就会立即填充文档中的所有其他相同片段,并将其标记为已确认状态。

自动可译元素处理(auto-translatables)

大多数文本(特别是技术、法律和财务类)都有遵循某种模式的重复出现的内容。比如日期:05/27/1978会被翻译为27.5.1978。自动翻译规则允许你利用正则表达式自动进行这类转换。

BiDi

BiDi,双向文本,是bidirectional text的缩写。阿拉伯语、希伯来语和波斯语是从右往左书写的,但同时,数字和一些用拉丁字母书写的名词是从左往右书写的。

双语Excel(bilingual Excel)

见多语言Excel(multilingual Excel)

双语RTF(bilingual RTF)

一种特殊格式的Word文档,包含翻译的原文句段和目标句段,通常还包括注释和其他信息。这样,翻译人员可以和没有CAT软件的客户或领域专家进行合作。反过来,CAT工具可以读取修改过的双语RTF,并将更新的内容导回翻译软件环境中。有些旧格式依赖于隐藏文本,并且很容易被一个错误的编辑所破坏。如今,一个包含三列或更多列的表格的文档更为常见。

CAL许可证(CAL License)

CAL是“并发访问许可证(concurrent access license)”的缩写。个人许可证允许个人用户运行单个程序,作为组织则可以购买CAL许可证,这些许可证可以按需分发给任何终端用户。限制主要在于有多少人可以同时使用这个工具。不管他们是谁,或者在哪里工作都没有限制。

计算机辅助翻译(Computer-aided Translation)

提高译员和审校翻译速度和质量的软件,多人同时处理一个大型文本也不在话下。有时,该名称会简化为“翻译记忆工具”,因为翻译记忆是CAT工具关注的第一个功能。Jost Zetzsche喜欢使用翻译环境工具或TEnT。这个叫法我也同意。翻译管理系统(TMS)经常被用作同义词,它们的边界实际上非常模糊。

CJJK

CJJK指东亚语言,包含汉语、日语和韩语。有两个C是因为中文有简体中文和翻译中文两种存在。

检出(check out)

当译员或者审校用memoQ执行在线项目检出操作时,memoQ会把任务文件下载下来并正确配置一个工作环境。这样就不用再使用邮件来发送附件,省去了一系列容易出错的步骤,节省时间,保证项目的参与者的文件和设置都是正确的。

内容管理系统(CMS)

一种用来编辑、组织和发布大量内容的软件。CMS系统通常能记录内容的负责人是谁,是否得到批准,是否过期,内容的适用对象等内容。通常,CMS系统会把内容拆分为小的部分,可以在多个相关文档中重复使用。CMS系统很重要,因为很多翻译内容需要从CMS系统获得,通常是小部分的XML文件,并且通常是DITA格式。

注释(comment)

在CAT工具中,您可以标记整个文档、源片段或目标片段,或者只标记段中的一部分。你可以添加注释或者使用这一功能来高亮文本。通过这种方式,您可以与其他翻译人员、审校或者客户进行交流,或者将某个内容添加到书签中,以便之后再查看。您可以将注释保密,也可以选择将其作为完成的翻译的一部分导出。

检索(concordance)

翻译记忆和LiveDocs语料库的一个功能,允许你搜索一个单词或表达式,检索所有匹配的翻译过的片段。这像一个小的“谷歌”,可以让你检索现有的翻译。memoq在目标片段中高亮出检索内容最可能对应的翻译,就像Linguee一样,但检索的是您自己的私有数据。

已确认(confirmed)

见句段状态(segment status)。

上下文ID(content ID)

通常是一个短的机器可读文本,用于标识属于应用程序或游戏中特定位置的字符串。同样的文本在不同的语境翻译结果可能是不一样的,比如标签上的“Open”翻译为德语是“Offen”,而按钮上的是翻译为“Öffnen”。翻译记忆会存储这个上下文ID,如果以后具有相同上下文ID的相同文本出现,就是显示该匹配为上下文匹配。

上下文匹配(context match)

见翻译记忆匹配类型

CSV

一种看似简单的基于文本的格式,每行存储若干值,用逗号分隔。它仍然广泛用于交换词汇表,有时甚至用于交换可翻译内容。尽管看起来很简单,但很容易出错;最常见的问题是使用错误的代码页而不是Unicode。

自定义字段(custom fields)

见元数据(metadata)。

交付(deliver)

译者或审校表明自己完成了任务,比如翻译给定的文件,这一动作叫做交付。交付不是一个象征性的步骤:在像memoq这样的系统中,它通常会触发一系列的操作,比如自动的质量保证检查或者通过电子邮件将完成的翻译返回到最终的客户。

听写(dictation)

允许您口述文本而不是在键盘上键入文本的技术。商业工具对主要语言的支持已经非常棒了。口述是少数译者的首选;不过有报告显示听写的效率比打字提高了50%或更多。

听写错误(dicto)

dicto是从typo发展出来的一个新词。表示听写软件的错误听写。打字错误可以容忍,但是听写错误是很严重的错误,因为它们虽然听起来像原文的短语,但意义却完全不同,就像一个不成熟的中学生笑话。想想Uranus。

DITA

DITA是达尔文信息分类架构(Darwin Information Typing Architecture)的缩写,它听起来很无聊,但非常有用。它是一个开放的标准,定义了如何在CMS系统中构造和重用内容。该格式基于XML,如果您的CAT工具支持它,您可以处理来自几个不同CMS的大量内容。

桌面出版(DTP)

DTP工具包括像FrameMaker和InDesign这样的工具,用于生成专业的排版打印文档。在行业中,DTP通常是翻译和审校后的进行的步骤。翻译后的文本在原始格式中看起来确实很糟糕,除非您调整排版以适应较长的段落、不同的特殊字符,甚至是变化了的文字方向。

编辑距离(edit distance)

一个文本转换到另一个文本,使用插入、删除和交换的操作,需要进行的操作次数叫做编辑距离。模糊匹配是根据编辑距离算出来的。编辑距离有时还会直接用于测量审校对译文修改的程度。

ELM许可证(ELM license)

见:CAL许可证(CAL License)

完全匹配(exact match)

见翻译记忆匹配类型

导出(export)

见文件格式过滤器(file format filter)

外部标签(external tags)

见标签

文件格式过滤器(file format filter)

CAT工具的一个主要好处是,无论文本的格式如何,你总是在同一熟悉的编辑器中进行翻译。这意味着CAT工具必须以某种方式从所有不同的文件格式中提取文本。执行此操作的组件称为文件格式过滤器:它“过滤”掉文件中所有其他内容,仅保留文本。把文件添加到CAT工具称为导入文件;以原始格式保存翻译内容称为导出文件。

每个过滤器都有自己的选项,这些选项会影响它的工作方式(比如是否要从Word文件中提取隐藏文本?),对于某些格式,尤其是XML,这些设置会产生巨大的差异。

查找/替换列表(find/replace listing)

在memoq中,查找功能有一个选项,可以将所有的匹配放在一个单独的列表中,而不是用弹出窗口逐个遍历它们。结果是用户可以得到一个查找/替换列表,在这里您可以轻松地查看每个片段,并决定替换的位置和保留的位置。

字体替换(font substitution)

许多文件格式,特别是DTP工具的文件格式,倾向于使用一些好看的特殊字体,但这些字体往往支持的字符数量有限。如果您的目标语言恰好有很多不常见的字符,那么翻译后的文件看起来会很难看,或者直接不显示某些字符。字体替换是文件格式过滤器的一个功能,它可以调整文件,用目标语言的字体替换原始字体。

片段组合(fragment assembly)

可能对于一个句段,您的记忆库或语料库没有精确或模糊匹配的片段,但这一句段的部分内容可能仍然与术语库的内容相匹配,或者有非译元素或自动可译元素。片段组合功能可以识别这些部分内容并用合适的译文进行替换,这样和从头翻译相比应该还是能节省不少工作。

模糊(fuzzy)

这里的第一印象是正确的:这是整个行业术语中最模糊的一个词。模糊匹配最初是用来和精确匹配形成对比的。模糊匹配的翻译的原文片段和你当前的片段会有些许不同。不同的程度用模糊匹配率来表示。最后,模糊匹配也被扩展到了术语,如果你的语言习惯于在单词中间改变字母,那么它会非常有用。

另见翻译记忆匹配类型

全局查找/替换(global find/replace)

在过去,只有当您首先打开一个文档时,“查找”功能才起作用。全局查找和替换会在项目的所有文档中进行。如果您的工作需要操作来自CMS的数百个小XML文件,这是一个非常方便的操作。

词汇表(glossary)

见术语库

高亮(highlight)

见注释

同质性(homogeneity)

常规的项目分析可以告诉你,你的文本中有多少模糊匹配或者完全匹配。匹配的内容是现有的翻译记忆和语料库。但是,即使你一开始的翻译记忆库是空的,随着你不断的翻译,片段也会得到越来越多匹配的内容。同质性功能可以把这些“内部”匹配作为分析的一部分进行处理,而不仅仅是检测重复内容。

水平布局(horizontal layout)

几乎所有CAT工具都采用了左列原文,右列译文的网格布局,就像一股急流冲走了可怜的河边露营者的ABC汤。但是许多译者仍然喜欢原文在上,译文在下的显示方式。水平布局选项可以重新组合活动句段,以原文在上,译文在下的形式展示。

导入(import)

见文件格式过滤器(file format filter)

行内标签(inline tags)

见标签

国际化(internationalization;i18n)

本地化产品需要的不仅仅是翻译:它包括以正确的格式显示日期、以摄氏度和华氏度显示温度、在姓氏后面写名字或反之亦然等内容。它需要额外的努力才能使产品做到这一切;这种努力称为国际化。

互操作性(interoperability)

CAT工具能够理解彼此的格式和API,并且能够很好地支持标准格式,这样,使用不同制造商的软件的人就可以在一起工作,而不会出现悲剧。

合并句段(join segments)

见句段(segment)

关键字上下文检索(KWIC)

一种用于展示检索结果的布局,其中匹配内容位于中间,前后文本位于两边,一行接一行。

利用(Leverage)

leverage是一个时髦的表达,To leverage past translations的意思是CAT工具提供了我已经翻译的内容,我不需要再翻一遍了。

轻量资源(light resources)

这是一个memoq的术语,指代非译元素、句段分割规则等内容。而重量资源指翻译记忆、LiveDocs语料、Muses,和它们相比,轻量资源的数据量更小。在许多其它的工具里,它们在设置里出现,而在memoQ中,它们是一种资源。它们有名字,可以被导进导出,可以在不同项目中被重复利用,也能通过memoQ服务器进行在线共享。

语言专家(linguist)

这一术语可能是翻译行业对英语的正确使用所犯下的最大的罪行。对于每一个受过教育的人来说,语言学家指的是像诺姆·乔姆斯基、威廉·拉波夫、丹尼尔·埃弗雷特,或者电影《降临》里的艾米·亚当斯这样的人:一个研究人脑中的语言或社会中的语言的科学家。在翻译行业,“语言学家”即指翻译或审校。

LiveAlign

memoQ的对齐操作名称,只需将一堆源文档和目标文档扔到工具里,就可以进行对齐。该工具首先对齐文档,然后对齐句段,并在后台对其进行索引,以便能在编辑器中立即检索到结果。错误不可避免会有,不多你只需花时间对齐那些匹配到的句段。

LiveDocs语料(LiveDocs corpus)

memoQ的翻译记忆替代品。翻译记忆不按特定顺序保存大量翻译片段,而LiveDocs语料库保留了整个翻译文档,并提供了相同类型的匹配。如果要检查过去翻译的上下文,可以直接从翻译编辑器跳到完整文档。翻译记忆有一个很大的优势:同样的翻译,它只存储一次。如果你的内容有很多重复,LiveDocs会变得很笨重。

本地化(localization;l10n)

有时用作翻译的同义词,不过通常本地化有更广泛的含义:它包括以正确的格式显示日期、以正确的货币显示货币等。为了使产品本地化,必须修改产品使其支持本地化操作,这叫做国际化。

本地化工程师(localization engineer)

了解CAT工具、讨厌的文件格式、正则表达式和其他奥秘的人。许多人也有很强的代码能力。他们确保在启动一个复杂的项目之前,所有内容都被正确导入,句段分割是正确的,不应该被修改的句段被锁定,等等。如果没有本地化工程师,复杂的项目将永远无法按时完成,而翻译人员则会拔光头发,搬到农场养猪。

锁定使用了不同语言的句段(lock segments in different languages)

没有一个CAT工具能够处理好源文档使用了混合语言的情况。在memoQ中隐藏着一个很好的功能可以锁定句段。这个不显眼的选项将检测每个句段的语言,如果它不同于文档的原文语言,则将其锁定。

锁定的(locked)

实际上,每个CAT工具的句段都有一个状态属性,如“新建”、“预翻译”或“已确认”。句段也可以被锁定,这使得它们是只读的。如果本地化工程师用客户批准或指定的翻译填充了一些片段,那么锁定可以确保这些片段不会被意外更改。在分析项目时,锁定的句段也很容易从字数统计中排除。

语言质量保证(LQA)

除了审读和修改译文,人工审校还可以标记他们找到的错误,从预先定义的列表选择错误的类型,错误的严重程度等其它细节内容。这些信息可以在以后进行评估,以客观地评价质量。LQA是在CAT工具在这方面提供的一个功能。

LSC

见自动检索(automatic concordance)

语言服务提供商(LSP)

向客户销售翻译服务的公司。

机器翻译(MT)

一种计算机系统,它把一个字符序列转换成另一种语言的序列。结果是人可以阅读的。目前主要有三种机器翻译系统。基于规则的系统(RBMT)需要人类手工制定语法规则。基于统计的系统(SMT)需要使用大量人工翻译文本进行训练。基于神经网络的系统(NMT)也需要使用人工翻译数据训练,但它们需要更多的计算,并且根据报道,可以得到更好的翻译结果。

像谷歌翻译这样的机器翻译针对的是通用的领域。在翻译行业中,更常见的是定制专门的系统,这些系统做专门领域的翻译做得很好。这需要机器翻译专家和一个相关的、高质量的大型人工翻译语料库。

使用机器翻译的一种方法是人的后期编辑:机器翻译系统产生的粗略的翻译,通常是不正确的和不符合文法的,但是在此基础上进行编辑比人从头翻译更便宜,更快。另一种方式是交互式的机器翻译,当人工译员在CAT工具中翻译文本时,会收到机器翻译系统的建议。

机器翻译后编辑(machine translation post-editing)

利用机器翻译的一种方法是译后编辑,即机器给出一个粗略的翻译,这个翻译可能并不正确,有语法问题,需要人来进行后期的编辑,改正错误,提高流畅度。

主翻译记忆(master TM)

见工作、主和参考翻译记忆(working, master and reference TM)

匹配率(match rate)

见翻译记忆匹配类型

MatchPatch

一种memoQ的功能,比较从翻译记忆和语料库得到的模糊匹配和翻译的原文不一样的部分,依赖于词库匹配、可自动翻译内容和非译元素的设置,生成对应的翻译。

元数据(metadata)

有关存储信息的其他详细信息,例如翻译单元的元数据包含“谁翻译的,什么时候翻译的,客户是谁”,而术语库条目的元数据包含“来源,客户是否批准”等。CAT工具通常支持一组标准字段,如上面的字段,但也允许用户定义自己的字段和类别以存储更多详细信息。

移动端许可证(mobile license)

见:CAL许可证(CAL License)

单语审校(monolingual review)

通过单语审校功能,你可以将翻译导出到其原始格式,在CAT工具环境外外进行更改,然后将这些更改从编辑过的目标语言文件中导回翻译环境。当您需要将工作发送给客户审校时,它特别有用,因为可能即使是双语Word文件,对于客户也显得太复杂了。

为什么要将这些更改重新导入CAT工具?是为了确保您的TM仅包含最终版本的翻译。不然,翻译记忆的内容就都是低质量的垃圾内容了。

MQXLIFF

memoQ的专有XLIFF格式文件,含有一些memoQ才有的信息,比如句段信息、QA警告、LQA错误、注释等等。

多语言Excel(multilingual Excel)

包含源文本、翻译、注释和其他信息的Excel文件。有时它是一个小巧的文件,有两列内容:源文本和目标文本。但有可靠的目击者报告说,他们见到过有50000行和25列不同语言的文件。这种巨大的的文件往往来自电脑游戏。

MultiTrans XML

SDL MultiTrans用于导出和导入术语的基于XML的格式。虽然不是官方标准,但它被广泛用于术语交换,即使是在完全不同的系统之间。

Muse

在memoQ中支持输入预测的资源之一。Muse通过对现有的记忆库和语料库的分析,抽取原文和译文对应的短语对。翻译新的原文句段时,Muse会查询之前存储的短语,并给出可能是原文中某个短语翻译的建议列表。

神经网络机器翻译(NMT)

见机器翻译

不换行空格(non-breaking space)

一种特殊的字符,看起来像一个普通的空格,但作用不同,因为它不允许句子在单词的左右两边换行。在法语中,冒号前面必须有一个非换行空格(你不希望一行内容的开头是“:”),数字和度量单位之间也必须有一个非换行空格(你也不希望开头是“cm”)。在大多数文字处理器中,您可以通过按ctrl+space来键入它。

非打印字符(non-printing characters)

空格、非换行空格、制表符和换行符。另外,在双向文本中使用的一些不可见字符。它们都是空白的,你通常看不到它们。和Word一样,CAT工具也有一个显示它们的选项,这样您就不会意外地键入两个空格,或者在该输入非断行空格的地方插入了一个正常的空格。

非译元素(non-translatables)

有点类似于术语,只是它们在所有语言中都是相同的。比如说品牌的名称,基本上是不需要翻译的。

光学字符识别(OCR)

一种将图像(如扫描的页面)转换为可编辑文本(通常是Word文档)的软件。在翻译中,OCR常用于将PDF格式的文档转换为可编辑或导入到CAT工具中的Word文档。

在线项目(online project)

一个在服务器中存储文档的Memoq项目,允许多个人同时翻译和查看文档,进行实时协同工作。在线项目还使分配工作变得非常简单,因为它们消除了在电子邮件中发送文件的功能,并防止了微不足道的错误,因为它们确保项目中的每个人都使用正确的设置和资源。

在线翻译记忆(online TM)

通过服务器或者云服务共享的翻译记忆。它们允许组织在一个中心节点存储它们的翻译,并能在需要时找到它们。他们还确保项目的翻译人员能够立即看到彼此的翻译,确保他们的工作是一致的。

即时过滤(on-the-fly filter)

所有高级CAT工具中都存在的一个功能,它允许您过滤正在处理的文档的句段。它是一个加强版的查找功能。你可以快速浏览包含某个词或者表达的句段,如果觉得翻的不好,可以随时修改。你也可以使用这个功能来隐藏已经确认的句段,这样就可以只关注需要工作的部分。

PDF

PDF是的Portable document format的缩写,设计目的是无论你在哪里查看或打印它,文档看起来都完全相同,这种一致性的代价是很难(几乎不可能)更改其中的文本。换句话说,它是一种单向格式,即你很难把PDF格式转换到其它格式,这使得它成为翻译行业最大的障碍之一。除了一些创新的解决方案,比如TransPDF,你最好的选择是用OCR工具将一个PDF文件转换成一个Word文件,然后翻译它。但最好是从您的客户获取源文档(InDesign、Framemaker或类似的DTP文件),并进行相应的翻译工作。

机器翻译译后编辑(PEMT; post-edited machine translation)

见机器翻译后编辑(machine translation post-editing)

惩罚(penalty)

有些翻译的可信度较低。它们可能太旧,来自水平较差的译者,或者适用于不同的客户和领域。惩罚意味着降低译文的匹配率,使其排名低于其它匹配。

永久许可证(perpetual license)

允许您永久使用软件的许可证。永久许可通常只适用于软件的特定版本,升级版本还是要花钱的。这是为了确保开发人员能够继续努力完善软件。

插件(plugin)

在较大的软件中执行特定任务的一个小模块。通常,任何人都可以开发一个插件,而无需该软件的开发人员参与。CAT工具中的一个典型例子是机器翻译插件。机器翻译商通过为CAT软件开发插件来为译员、语言服务商或公司提供他们的服务。只要CAT工具的开发人员通过创建和发布一个SDK,使得应用程序对外提供交互的接口,就可以创建插件。

填充纯数字片段(populate number-only segments)

很多时候,源文档有许多只包含数字的部分,比如财务报告。数字很有趣。他们不需要传统意义上的翻译,但是他们也不能直接翻译成译文:目标语言的数字使用分割符的约定是不同的。这个功能可以一次处理所有带数字的句段,并调整它们的格式。

译后分析(post-translation analysis)

缩写是PTA,它和普通的分析相似,不过是翻译完成后立刻执行的。翻译大型文本时会产生很多的“内部”记忆匹配,有模糊的也有精确的。当两个或两个以上的译员一起工作时,很难说谁会从头翻译一个句段,谁会得到别人翻过的内容的匹配。对此,memoQ会在它的在线项目进行跟踪,并在所有工作完成后给出精确而公平的任务量分析。

顺便说一下,译前分析匹配的数字与同质性分析中的数字非常接近。不同的是,PTA的分析可以显示出译员各自在翻译时使用了多少内部匹配。这些内部匹配是一开始同质性分析时就有预测。

输入预测(predictive typing)

CAT工具最性感的功能之一,但名字并不性感。输入预测可以使翻译速度更快(通过减少击键)、内容更一致(通过提供正确的输入内容)。它分析用户输入的字符,然后根据当前句段的术语库匹配、自动可译元素、非译元素、Muse提示和其它资源来提供一个建议列表。

预翻译的(pre-translated)

见句段状态(segment status)和预翻译(pre-translation)

预翻译(pre-translation)

预翻译会分析文档中的每个句段,并自动用翻译记忆和语料库中的内容进行填充。

预览(preview)

预览功能可以原始格式或近似格式查看翻译的文档。CAT工具将文本拆分为句段,让您在相同的高效环境中进行翻译,而不用管原始文件格式。但视觉上下文信息是丢失了的,你看不到译文在原始文档中是什么样的。解决这种CAT软件自己造成的痛苦的方法是预览。

项目主页(project home)

在memoQ的项目主页,你可以添加或删除要翻译的文档、选择翻译记忆、术语库、Muse和其他资源。当你犯拖延症时,你也可以用无数其他方式来把玩你的工作环境。

项目管理系统(project management system)

项目管理系统可以跟踪翻译任务、价格、客户、供应商、截止日期、发票以及运行翻译业务或部门所需的大量其他内容。

项目模板(project templates)

处理很多有重复或至少类似的翻译工作,你不得不一遍又一遍地做同样的事情:选择合适的翻译记忆、术语库、轻量资源、设置、人员等,然后还要执行相同的操作,如分析、预翻译等。项目模板可以为以上这些定义规则。这样你就不会犯令人尴尬的错误,也不会因为不停的点击而导致肌腱炎,并且能在这类繁琐工作中保持清醒。此外,项目模板允许您重用本地化工程师等专家的工作,并使新员工更容易跟上进度。

伪翻译(pseudo-translation)

文本翻译是有趣的一个环节,但是如果你处理的是来自深奥系统的复杂文件格式,你需要确保你的工作可以正常导回原来的系统(正常生成目标文件),而不是在项目截止前弄坏你的客户花数百万美元买的旗舰应用程序。伪翻译允许您测试整个过程,而不需要实际翻译任何内容。它会把源文本替换为有趣的目标语言字符。

译后分析(PTA)

见译后分析(post-translation analysis)

质量保证(QA; quality assurance; automatic QA)

机器很难像人类一样创造出能引起共鸣的内容,但人类在正确处理数字和其他无聊和重复的事情上的表现确实很糟糕。这时质量保证检查可以发挥作用:它能验证了你的数字是否正确,你有没有键入两个连续空格,你是否使用了MegaCorp公司的官方术语,你在整个文本中是否以同样的方式翻译了相同的内容,你有没有忘记一个关键的标签,等等。如果愚蠢的机器做出了错误的判断,您总是可以选择忽略(禁止)个别的QA警告。

参考翻译记忆(reference TM)

见工作、主和参考翻译记忆(working, master and reference TM)

正则表达式(regular expressions; regex)

即使是人类写的文本也可以发掘出明确的模式。比如美国用MM/DD/YYYY来表示日期。而德国也是采用的类似的日期格式,不过他们使用点来作为间隔符。正则表达式是一种非常反直觉但非常有用的,可以精确描述以上类型内容的模式的方式。CAT工具全面支持正则表达式,从定义文件格式过滤器到自动可译元素,再到查找/替换,都有使用到。熟悉正则表达式,你就相当于半个本地化工程师了。

拒绝的(rejected)

见句段状态(segment status)

重复(repetition)

在源语文本中出现至少两次的句段叫做重复句段。出现重复是好事,因为通常你只需要翻译相同的内容一次。自动填充和完全匹配使用的就是重复的句段。对于必须以不同方式翻译相同内容的情况,您可以使用上下文ID进行区分。

从右往左文本(RTL; right-to-left)

见BiDi。

软件开发套件(SDK; software development kit)

一组工具和文档,允许开发人员构建自己的模块,以便与不同的软件一起工作。比如SDK允许第三方为CAT工具开发插件。

句段(segment)

我们翻译文本的时候,基本都是以句子为单位进行的。然而,没有人真正知道一个句子到底是什么。列表中的一个单词是一个句子吗?CAT工具决定完全回避句子的叫法,改用“句段”。

一般来说(尽管并非总是如此),句段是翻译的基本单位:您在编辑器中按句段进行翻译,并把句段的翻译存储在翻译记忆中。你的翻译记忆和语料库匹配也指的是你目前正在翻译的句段。

句段是使用句段分割规则来进行切分的,这些规则是用正则表达式描述的。就像所有的正则一样,它们在外行眼中看来就是一堆乱码,但它们基本上遵循这样的一个模式:“如果你发现句子的最后标点像一个句点,后面跟着一个或多个空格,后面跟着一个大写字母,那么就从那里开始一个新的句段。除非句号前的最后一个词是已知的缩写。”当您的CAT工具的文件格式过滤器导入源文档时,通常会在幕后悄悄地进行句段分割。

但再全面的分割规则也难免会出错。为了解决这个问题,CAT工具有一个功能,可以合并相邻的句段,或将一个句段拆分为两个。

句段状态(segment status)

从你把一份文件导入你的CAT工具的那一刻起,通过翻译、审校、客户审校、一晚上好觉后第二天进行的校对以及二校,直到把它交付给你的客户,文本是以句段的形式存在的。因此,除了文本本身之外,还需要知道很多关于句段的信息:目标是来自翻译记忆的,还是我自己翻的?翻译有没有得到确认?它是不是被审校拒绝了?是不是还处于编辑状态,不是最终的完成状态?这是您可以在翻译环境中通过颜色和图标的形式看到的信息。

我的火星人朋友们到来后的几年里都确信翻译人员的工作是把空的(灰色)片段转变成确认的(绿色)片段,他们认为这是一个非常吸引人的工作。现在他们知道自己错了,但他们仍然认为这份工作很棒。

句段分割(segmentation)

见句段(segment)

同时翻译与审校(simultaneous translation and review)

在线协作CAT工具的一个功能,允许几个人一起实时编辑同一文档。你可以把它看作是加强版的为翻译定制的Google Docs。

支持与维护协议(SMA; support & maintenance agreement)

许可协议允许您使用某个软件,而与之配套的SMA通常允许您获得人工支持和软件的新版本。通常,永久性许可证只收取一次性费用;与此相反,SMA每年收取一次费用。

统计机器翻译(SMT; statistical machine translation)

见机器翻译

分割句段(split segments)

见句段(segment)

句段分割规则(SRX; Segmentation Rules eXchange)

一种基于XML的标准,允许不同的CAT工具读取彼此的分割规则。

子片段的利用(subsegment leverage)

这是一个翻译行业最模糊词汇的有力竞争者,仅次于模糊这次词。CAT工具供应商标榜这一功能时,他们基本上想说:“我们正在做一些非常先进和有用的事情。”简单地说,这一功能可以根据原文片段的一部分得到翻译建议。产生这种建议的机制是相当先进的,可以从过去的翻译中总结出咋一眼看去并不明显的知识。

统计信息(statistics)

见分析(analysis)。

字符串(String)

用开发的语言描述,字符串是一个字符序列。翻译软件应用程序或游戏的用户界面时,出现在不同位置的所有文本块都称为“字符串”。通常,一个字符串显示为一个单独的句段,它有一个关联的上下文ID来消除它的歧义。

结构标签(structural tags)

见标签

同步(synchronize)

在memoQ在线项目中工作时,您可以选择不立即在服务器上保存每个翻译的句段,而是在本地收集大量更改,然后一次性与服务器交换。这一操作叫做项目同步,

表格RTF(table RTF)

见双语RTF(bilingual RTF)。

标签错误(tag error)

一些内联标记是可选的:也许源文本中的粗体格式在您的翻译中根本不需要。然而,还有一些标签是非常重要的。比如果“你还有N个敌人”这句话中,N是以标签的形式存储的,那么如果你省略了标签,翻译后的游戏程序可能崩溃,游戏玩家的愤怒将使你的客户破产。为了避免这种情况,CAT工具的QA模块可以在编辑器里给出标签错误的提示,并且直到标签错误得到修复才允许进行交付操作。

标签插入模式(tag insertion mode)

当你翻译时,标签可能是一个真正的麻烦:你需要考虑它们放在哪里,你需要快捷输入标签的方法。而且,标签会影响正常的翻译思路。因此,在memoQ中,您可以先集中精力翻译一个句段的文本,然后激活标签插入模式,并在目标句段的正确位置插入标签。

清理标签(tag soup)

导入的文档中充满了多余的、无意义的标签时,是一种不幸但频繁的情况。这通常发生在导入使用OCR转换PDF得到的Word文档时,因为生成的文档希望确保所有内容都显示在正确的位置,精确到百分之一毫米,所以会有很多标签。您可以通过调整OCR工具的设置、使用清理标签的宏(如Dave Turner的codezapper),或者缠着您的CAT工具的开发人员来做一些事情来改善情况。只有前两个被确凿地证明是有效的。

标签(tags)

我们需要翻译的内容大部分是文本,但不是唯一的内容。比如要确定翻译中的文本的哪一部分对应原文中有颜色的部分。另外还有结构化内容的处理,其中文本与标记(如超链接、交叉引用或占位符)交织在一起,当一个软件运行时,这些标记将被替换为数字。

CAT工具通过引入标签来应对所有这些问题。句段中的标签在编辑器中的作用类似于字符,但看起来完全不同。它们被称为行内标签或者内联标签。

像XML或HTML这样的格式,把标签编织到了自己的DNA中。其中一些标记定义结构(如标题、说明文字),并把文字封装在标签里面。这些称为结构标记或外部标记,不应出现在您的句段中。只有在导入之前XML过滤器配置不正确时,它们才会出现。你可以通过雇佣一个好的本地化工程师来解决这个问题。

好的CAT工具的分析输出有一个单独的部分,该部分会显示了除了字符之外,文本还包含多少标记。这一点很重要,因为标签可能需要很多工作,会减慢翻译的速度。

TB

见术语库

术语库交换格式(TBX; TermBase eXchange)

一种基于XML的标准,允许CAT工具和其他软件交换术语。

修订匹配(TC match)

让人精神分裂的概念,不知道它是匹配率还是句段状态。当您需要翻译包含跟踪更改的原文句段时,它就有用了。TC匹配是指修订过的原文句段的原始文本的精确匹配,假装那些跟踪修订不存在。

见跟踪修订(track changes)

翻译编辑校对(TEP; translation-editing-proofreading)

一种广泛使用的工作流程,一名译员和两名不同的人员,按顺序对翻译进行审校,目的是确保高质量的翻译,并为译员提供反馈以改进翻译。

术语库(term base)

一个“数据库”或CAT工具的一个组件,允许用户存储重要的单词/表达等等。它省去了两次研究同一术语的麻烦。它还帮助翻译人员遵守客户指定的术语,或者至少与自己保持一致。事实上,如果不同的人同时翻译同一个大文本,在不同的地点进行在线协作,术语库是保持一致性所必需的。

通常与词汇表互换使用,但它们并不完全相同。词汇表通常只是包含两种语言的单词列表,而术语库有结构信息和元数据。

术语抽取(term extraction)

高级CAT工具的一种功能,可以从新的源文本或现有翻译对中提取重要的单词和表达。输出结果通常包含许多错误的术语,但它允许翻译人员在开始翻译之前研究重要的术语,将它们包含在术语库中,确保随后正确地翻译它们,并保持一致性。

术语数据库(terminology database)

见术语库

翻译记忆(TM; translation memory)

翻译记忆这一想法产生了最初的商业翻译技术。为什么要翻译同一句话两次?翻译记忆是存储句段及其翻译的数据库。翻译记忆技术发展迅速,模糊匹配、检索和子片段匹配是利用翻译记忆的新方式。

翻译记忆匹配类型(TM match types)

翻译记忆像一个袋子,装着原文句段和其对应的翻译。当新的句段出现时,CAT工具会在这个袋子里寻找以前翻译过的相似句段,并将其作为匹配项返回。如果袋子里有相同的句子,那就是一个精确匹配,匹配率为100%。它可以变得更好:如果有一个翻译不仅句段内容相同,而且上下文也完全相同,那就是一个上下文匹配。如果匹配率低于100%,那就是模糊匹配。通常,高匹配度的模糊匹配价值更大:这些匹配只在标点、大小写或数字上有所不同,因此更易于使用。

翻译记忆驱动的句段分割(TM-driven segmentation)

memoQ的一种高级功能,在预翻译时动态分割或合并句段,以获得更好的翻译记忆匹配。这个想法很简单。如果一个译员在将翻译存储在记忆库之前合并了两个句段,而现在相同的两个句段又出现了呢?通过识别这种情况,新的文本中的这两个句段可以得到合并,从而得到一个完美的匹配。

翻译管理系统(TMS; translation management system)

帮助您管理翻译和组织资源的软件。以下这种情况需要管理:“1500个文件必须翻译成25种语言,6名译员和2名审校同时为每种语言工作,确保没有人覆盖过去批准的翻译,并在下周一前准备好,实时了解项目的进展情况,直到交付。”以下这种情况需要组织:“我必须从2000种为不同用户和语言对提供的资源中找到正确的翻译记忆和术语库。”

翻译记忆交换格式(TMX; Translation Memory eXchange)

一种基于XML的格式,用来交换翻译记忆。采用该标准是业界朝着互操作性迈进的关键一步,目前几乎所有工具都支持该标准。

跟踪修订(track changes)

法律要求许多受监管行业(如制药)跟踪其对关键文件所做的每一项更改,例如使用说明和药物的副作用。不仅如此,当他们向多个市场销售时,他们还必须在翻译材料中体现所有这些变化。作为一名翻译人员或LSP,在不丧失理智,不因为追求利润而被起诉的情况下实现这一目标的唯一方法是,您的CAT工具具有特殊功能,既能处理跟踪修订的文档,又能保留翻译记忆、术语库、质量检查和其他所有功能的好处。

见跟踪修订匹配(TC match)

翻译单元(translation unit)

在CAT工具中,用户以句段为单位翻译文档。而当把原文句段的翻译存储在TM中时,原文和译文加上一些元数据(如谁翻的,什么时候翻的)就被合在一起转换为一个翻译单元。

垃圾进,垃圾出(trash in, trash out)

假设你在你的TM中存储了一个无意义的翻译。当你收到更新的文档时,预翻译会将其视为一个完美的匹配,结果你就没有再看它第二眼。如果用这些数据训练一个机器翻译引擎,它将产生质量极差的翻译。一旦垃圾进入系统,它就会一直存在。该怎么避免呢?通过QA,通过TEP,通过分离工作和主翻译记忆以及其他类似的操作。这需要你能够集中式管理资源,制定正确的处理流程,避免容易产生错误的手工操作。

两列Excel(two-column Excel)

见多语言Excel(multilingual Excel)

Unicode

根据维基百科,Unicode是一种计算行业标准,用于对世界上大多数书写系统中表示的文本,进行一致的编码、表示和处理。

在我看来,Unicode是自切片面包以来人类发明的最好的事情。这意味着,如果你用你自己语言的特殊字符写一个文本,那么世界上任何地方的人都可以使用任何带有CPU和显示器的设备来阅读该文本。甚至是在Excel里的文本。

不过,我们的世界不是完美无缺的,你必须记住,虽然Unicode不支持克林贡语,但它确实有手枪的emoji。

UTF-8

见Unicode

提供商(vendor)

在我们的行业中,为其他人或企业提供翻译服务的人或企业。

视图(view)

CAT工具显然是解构主义的狂热爱好者,最早的版本就把文本撕成称为句段的片段。你也可以通过视图来充分调用这些句段。“我刚刚将此用户指南转换为1300个句段,并对其进行了预翻译。现在给我那些没有翻译记忆匹配的片段,要求至少出现两次,其中有单词‘眯眼松鼠’。另外,给我显示只出现过一次的片段,并且按字母顺序排列。”这是视图允许你做的事。

网络编辑器(web editor)

CAT工具的一个组件,允许在线项目中的译员和审校在浏览器中工作,而不需要在自己的计算机上安装软件。Web编辑器对传统的桌面工具来说就像Google Docs之于Word一样。不过高级的CAT工具既提供在线版也提供桌面版,还不强迫您在两个不兼容的公司之间做出选择。

字数统计(word count)

见分析(analysis)

工作、主和参考翻译记忆(working, master and reference TM)

保持事物井然有序是一项由来已久的挑战。如果你不把它处理好,结果会是垃圾进,垃圾出。在翻译项目中,一个好的管理方法是将一个TM指定为主版本(来自主版本的翻译优先于其他版本);将另一个TM指定为工作TM(新的、未经审校的翻译存储在工作版本中,保持主版本的纯净);其余翻译记忆则作为参考(主版本TM的内容可能不够全面)。

XLIFF

XML本地化交换文件格式的缩写,由OASIS维护的标准。实际上,它是一种文件格式,允许在源/目标双语形式的工具之间传递可翻译文本。

可扩展标记语言(XML; eXtensible Markup Language)

一种极为通用的格式,用于将结构化信息存储在机器可读的文件中。对于人来说也具有一定的可读性。翻译的大量内容来自XML文件,特别是当内容的来源是CMS系统时。一般来说,除非您是本地化工程师,否则您不需要了解XML的详细信息。

X-translate

你已经完成了一半的文件翻译工作,其中有大量的注释和状态各不相同的句段。这时,你的客户打电话给你说:“嘿,我们的编辑很忙,我们有一个修改过的源文件,我们实际上需要你翻译这个文件,而不是上周的那个。”如果您的CAT工具有X-translate功能,这将不是问题。X-translate将原始源文档与更新的源文档进行比较,逐句段进行,并重新记录你的工作,包括注释、忽略的QA警告、句段状态和所有其他内容。如果源文本的句段有变化,那就保持一个未翻译的初始状态。这样你可以翻译更改的部分,并在之前停止的地方继续翻译。

]]>
基于Elasticsearch构建翻译资源检索系统 2019-03-13T10:27:50+00:00 xulihang blog.xulihang.me/build-a-translation-resource-management-system-based-on-elasticsearch 翻译部门常常会有一堆存在硬盘上的过往的翻译资源以及不断产生的新的资源,可以利用Elasticsearch构建一个全文搜索引擎进行管理。

索引

这些资源文件一般会以文件夹进行管理,结构依次是分类-项目名-文件。

其中文件有源文档和目标文档。比较结构化的一种文件整理法是源文档放在source文件夹,目标文档放在target文件夹,然后源文档和目标文档的名字一样。使用CAT软件后还可以有句对齐的翻译记忆,这里先不考虑。

我们可以在Elasticsearch中建一个documents索引,然后保存的文档按以下内容组织:

 "_source" : {
          "filename" : "Apple just dismissed more than 200 employees from Project Titan.txt",
          "project" : "163",
          "sourceOrTarget" : "target",
          "text" : "苹果自动驾驶项目Project Titan裁员逾200人",
          "category" : "AI",
          "title" : "Apple just dismissed more than 200 employees from Project Titan"
}

添加中文支持

默认的分词器会把中文分成单字,没有词语。通过添加analysis-ik可以对中文进行分词。

这样检索时可以按词语进行检索,匹配效果更好。

设置mapping时一般对全文使用ik_max_word分析,对搜索的关键词进行ik_smart分析。前者分词的粒度更细,供检索的词就越多。而后者用于关键词,可以保证检索结果和关键词更加匹配。

不过有一个问题就是无法检索单字,因为默认没有对单字进行索引。我们需要修改ik默认的配置文件添加单字词典。配置文件是在plugins\ik\config目录的IKAnalyzer.cfg.xml文件,可以看到目录里还有extra_single_word.dic这个单字词典,默认没有使用。我选择先添加这个词典。

保存后的配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<comment>IK Analyzer 扩展配置</comment>
	<!--用户可以在这里配置自己的扩展字典 -->
	<entry key="ext_dict">extra_single_word.dic</entry> <!-- 这里我进行了修改 -->
	 <!--用户可以在这里配置自己的扩展停止词字典-->
	<entry key="ext_stopwords"></entry>
	<!--用户可以在这里配置远程扩展字典 -->
	<!-- <entry key="remote_ext_dict">words_location</entry> -->
	<!--用户可以在这里配置远程扩展停止词字典-->
	<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

多字段检索

多字段检索可以使用multi_match,相当于使用should的bool。

我这里统一使用bool。比如我要检索的内容必须符合某个分类以及是原文还是译文,在title或者text中有匹配就行。可以写出以下的表达式:

{"bool":
    {"must":
        [
            {"match" : {"category" : "分类"}}, 
            {"match" : {"sourceOrTarget" : "target""}},
            {"bool" : {
                "should" : [
                    {"match" : { "title" : "apple"}},
                    {"match" : { "text" : "apple"}}
                    ]
                    }
                  }
        ]
    }
}

通配符与模糊匹配

要检索包含227的内容,可以输入*227*来检索,*表示匹配多个字符,?表示匹配单个字符。

curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
    "query" : {
        "wildcard":{"text":"*227*"}
    }
}'

模糊匹配是使用了编辑距离,编辑距离如果小于某个值就算是命中。比如检索excite,可以检索到编辑距离为2的excited,或者是拼写错误,are输成了aer,也可以显示正确的结果。

curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
    "query" : {
        "fuzzy":{"text":"excite"}
    }
}'

以上两个主要是把默认的match换成wildcard和fuzzy。另外还支持正则,regexp。

获得分类列表

可以使用aggregation来获得某个字段的值的列表。

curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
	"size" : 0 ,
    "aggs" : {
        "categories" : {
            "terms" : { "field" : "category.keyword" }
        }
    }
}'
{
  "took" : 38,
  "timed_out" : false,
  "_shards" : {
    "total" : 16,
    "successful" : 16,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 27,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "categories" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "童书",
          "doc_count" : 12
        },
        {
          "key" : "默认分类",
          "doc_count" : 4
        },
        {
          "key" : "pdf",
          "doc_count" : 2
        }
      ]
    }
  }
}

具体实现

使用B4J做后端,BANano写前端。

后端

后端与elasticsearch进行交互。每个一段时间会检查翻译文档目录。通过建立meta索引保存之前索引的文件修改的时间,可以知道哪些文件有更新,有更新而且源文档和目标文档同时存在就进行索引。如果文档不是txt格式,就利用okapi tikal转换为xliff,然后再提取纯文本的内容。

对外提供检索接口。

前端

前端调用后端接口,提供一个完整的搜索引擎的功能。使用BANano开发,前后端可以分离。

主要做好结果展示、分页,检索选项等内容。

]]>
Elasticsearch 2019-03-09T10:41:50+00:00 xulihang blog.xulihang.me/elasticsearch Elasticsearch是一个分布式的搜索引擎,可以检索全文并进行分析。其实和mongodb很像,不过Elasticsearch把文件存在Lucene index文件里,而mongodb存在bson里,另外es的文本功能也更丰富。

我之所以要用Elasticsearch是因为公司过去十几年的翻译文件只是以文件的形式存在硬盘里,没有能够好好地利用起来,如果能用搜索引擎对所有文件进行全文检索那就可以提高利用程度。

了解Elasticsearch可以访问官网的教程:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

Elasticsearch是用java写的,以rest api或者java api对外提供接口。可以通过http://127.0.0.1:9200访问。

Table of Contents

相关概念

  • Near Realtime(近乎实时),从检索文件到可以被搜索到只需要很短的时间
  • Node and Cluster(节点和集群),node就是在一台电脑上运行的实例,一组node构成一个cluster
  • Index(索引),Index就是一堆文件的集合,这类文件应该有相似的结构,比如都具有某个属性
  • Type(类型),Index下还可以细分成几个type,但是Elasticsearch6开始只能有一个type,而7.0后就将弃用。
  • Document(文档),信息的基本单元,用json格式来进行描述
  • Shards(分片),如果要index存储的数据很多,那么磁盘空间可能不够,而且读写性能会有问题。通过拆分index为一个个shards,可以解决这一问题。
  • Replica是shard的备份,规避节点出现故障的风险

基础操作

添加三个文档到叫做twitter的索引

curl -XPUT 'http://localhost:9200/twitter/_doc/1?pretty' -H 'Content-Type: application/json' -d '
{
    "user": "kimchy",
    "post_date": "2009-11-15T13:12:00",
    "message": "Trying out Elasticsearch, so far so good?"
}'

curl -XPUT 'http://localhost:9200/twitter/_doc/2?pretty' -H 'Content-Type: application/json' -d '
{
    "user": "kimchy",
    "post_date": "2009-11-15T14:12:12",
    "message": "Another tweet, will it be indexed?"
}'

curl -XPUT 'http://localhost:9200/twitter/_doc/3?pretty' -H 'Content-Type: application/json' -d '
{
    "user": "elastic",
    "post_date": "2010-01-15T01:46:38",
    "message": "Building the site, should be kewl"
}'

列出所有索引

$ curl -X GET "localhost:9200/_cat/indices?v"

结果:

health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   twitter FLSTkYHXRIqIQajFzNnVDQ   5   1          3            0       14kb           14kb

查看某个索引

$ curl -XGET 'http://localhost:9200/twitter/_doc/1?pretty=true'

结果:

{
  "_index" : "twitter",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "user" : "kimchy",
    "post_date" : "2009-11-15T13:12:00",
    "message" : "Trying out Elasticsearch, so far so good?"
  }
}

检索

有两种办法。

使用URL:

curl -XGET 'http://localhost:9200/twitter/_search?q=user:kimchy&pretty=true'

或者使用Elasticsearch的基于json的查询语言:

curl -XGET 'http://localhost:9200/twitter/_search?pretty=true' -H 'Content-Type: application/json' -d '
{
    "query" : {
        "match" : { "user": "kimchy" }
    }
}'

结果:

{
  "took" : 20,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 0.6931472,
    "hits" : [
      {
        "_index" : "twitter",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.6931472,
        "_source" : {
          "user" : "kimchy",
          "post_date" : "2009-11-15T14:12:12",
          "message" : "Another tweet, will it be indexed?"
        }
      },
      {
        "_index" : "twitter",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
          "user" : "kimchy",
          "post_date" : "2009-11-15T13:12:00",
          "message" : "Trying out Elasticsearch, so far so good?"
        }
      }
    ]
  }
}

可以使用size可以指定检索返回几条结果,使用from指定从第几条开始返回结果。

$ curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
    "from" : 0, "size" : 1,
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}
'

更新

$ curl -X POST "localhost:9200/twitter/_doc/1/_update?pretty" -H 'Content-Type: application/json' -d'
{
  "doc": { "user": "Jane Doe" }
}
'

删除

$ curl -X DELETE "localhost:9200/twitter/_doc/2?pretty"

检查健康状况

$ curl -X GET "localhost:9200/_cat/health?v"

结果:

epoch      timestamp cluster       status node.total node.data shards pri relo i                    nit unassign pending_tasks max_task_wait_time active_shards_percent
1552132035 11:47:15  elasticsearch yellow          1         1     15  15    0                        0       15             0                  -                 50.0%

更复杂的操作

Highlight 高亮

检索之前存储的文档的message内容,并高亮匹配的内容。

curl -X GET "localhost:9200/_search?pretty=true" -H 'Content-Type: application/json' -d'
{
    "query" : {
        "match": { "message": "tweet" }
    },
    "highlight" : {
        "fields" : {
            "message" : {}
        }
    }
}
'

结果:

{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 15,
    "successful" : 15,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.6931472,
    "hits" : [
      {
        "_index" : "twitter",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.6931472,
        "_source" : {
          "user" : "kimchy",
          "post_date" : "2009-11-15T14:12:12",
          "message" : "Another tweet, will it be indexed?"
        },
        "highlight" : {
          "message" : [
            "Another <em>tweet</em>, will it be indexed?"
          ]
        }
      }
    ]
  }
}

如果不想显示_source里的内容,可以在表达式里加上_source,变成以下这样的:

curl -X GET "localhost:9200/_search?pretty=true" -H 'Content-Type: application/json' -d'
{
    "query" : {
        "match": { "message": "tweet" }
    },
    "_source":"", 
    "highlight" : {
        "fields" : {
            "message" : {}
        }
    }
}
'

结果:

{
  "took" : 13,
  "timed_out" : false,
  "_shards" : {
    "total" : 15,
    "successful" : 15,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "twitter",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.2876821,
        "_source" : { },
        "highlight" : {
          "message" : [
            "Another <em>tweet</em>, will it be indexed?"
          ]
        }
      }
    ]
  }
}

aggregations 聚合

类似于SQL中的GROUP BY,可以对数据进行分析然后分组。

用法:

curl -X GET "localhost:9200/twitter/_search?pretty=true" -H 'Content-Type: application/json' -d'
{
    "aggs" : {
        "usernames" : {
            "terms" : { "field" : "user.keyword" }
        }
    }
}
'

其中usernames可以自己定义,我们这里使用的term aggregation,根据字段进行分组。

除了检索结果,可以看到还多了aggregations这一部分。其中buckets是符合检索条件的文档的集合,里面会包含一些统计信息。

{
  "took" : 7,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "twitter",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "user" : "kimchy",
          "post_date" : "2009-11-15T14:12:12",
          "message" : "Another tweet, will it be indexed?"
        }
      },
      {
        "_index" : "twitter",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "user" : "kimchy",
          "post_date" : "2009-11-15T13:12:00",
          "message" : "Trying out Elasticsearch, so far so good?"
        }
      },
      {
        "_index" : "twitter",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "user" : "elastic",
          "post_date" : "2010-01-15T01:46:38",
          "message" : "Building the site, should be kewl"
        }
      }
    ]
  },
  "aggregations" : {
    "usernames" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "kimchy",
          "doc_count" : 2
        },
        {
          "key" : "elastic",
          "doc_count" : 1
        }
      ]
    }
  }
}

把size设置为0,这样就不会显示hits内容:

curl -X GET "localhost:9200/twitter/_search?pretty=true" -H 'Content-Type: application/json' -d'
{
    "size":0, 
    "aggs" : {
        "usernames" : {
            "terms" : { "field" : "user.keyword" }
        }
    }
}
'

结果:

{
  "took" : 41,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "usernames" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "kimchy",
          "doc_count" : 2
        },
        {
          "key" : "elastic",
          "doc_count" : 1
        }
      ]
    }
  }
}

使用中文分词

elasticsearch在检索中文时会把检索词拆分成一个个单字然后进行匹配。比如以下这样的:

检索:

$ curl -X GET "localhost:9200/_search?pretty=true" -H 'Content-Type: application/json' -d'
{
    "query" : {
        "match": { "message": "名字张三" }
    },
    "highlight" : {
        "fields" : {
            "message" : {}
        }
    }
}
'

结果:

{
  "took" : 140,
  "timed_out" : false,
  "_shards" : {
    "total" : 15,
    "successful" : 15,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.1507283,
    "hits" : [
      {
        "_index" : "twitter",
        "_type" : "_doc",
        "_id" : "5",
        "_score" : 1.1507283,
        "_source" : {
          "user" : "kimchy",
          "post_date" : "2009-11-15T13:12:00",
          "message" : "我是中华人民共和国的成员,我的名字叫张三。"
        },
        "highlight" : {
          "message" : [
            "我是中华人民共和国的成员,我的<em>名</em><em>字</em>叫<em>张</em><em>三</em>。"
          ]
        }
      }
    ]
  }
}

我们可以使用ik插件来进行分词。

在此https://github.com/medcl/elasticsearch-analysis-ik下载和安装ik插件,然后重启elasticsearch。

重新建立一个索引:

$ curl -XPUT http://localhost:9200/twitter

设置索引里的文档的mapping,使用ik进行分析:

curl -XPOST http://localhost:9200/twitter/_doc/_mapping -H 'Content-Type:application/json' -d'
{
        "properties": {
            "message": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_max_word"
            }
        }

}'

添加一条带中文的记录:

$ curl -XPUT 'http://localhost:9200/twitter/_doc/5?pretty' -H 'Content-Type: application/json' -d '
{
    "user": "kimchy",
    "post_date": "2009-11-15T13:12:00",
    "message": "我是中华人民共和国的成员,我的名字叫张三。"
}'

检索结果:

{
  "took" : 10,
  "timed_out" : false,
  "_shards" : {
    "total" : 15,
    "successful" : 15,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.8630463,
    "hits" : [
      {
        "_index" : "twitter",
        "_type" : "_doc",
        "_id" : "5",
        "_score" : 0.8630463,
        "_source" : {
          "user" : "kimchy",
          "post_date" : "2009-11-15T13:12:00",
          "message" : "我是中华人民共和国的成员,我的名字叫张三。"
        },
        "highlight" : {
          "message" : [
            "我是中华人民共和国的成员,我的<em>名字</em>叫<em>张三</em>。"
          ]
        }
      }
    ]
  }
}

这里我们修改的mapping是用来定义字段的属性的,添加文档时会进行自动生成,并且不推荐再进行更改。我们要修改的话就得重新索引。

查看修改后的mapping:

$ curl -XGET 'http://localhost:9200/twitter/_mapping?pretty=true'
{
  "twitter" : {
    "mappings" : {
      "_doc" : {
        "properties" : {
          "message" : {
            "type" : "text",
            "analyzer" : "ik_max_word"
          },
          "post_date" : {
            "type" : "date"
          },
          "user" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          }
        }
      }
    }
  }
}

其它

如果硬盘空间占用过高(高于95%,说明见此),elasticsearch会切换为只读状态,会提示以下错误:

{
  "error" : {
    "root_cause" : [
      {
        "type" : "cluster_block_exception",
        "reason" : "blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"
      }
    ],
    "type" : "cluster_block_exception",
    "reason" : "blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"
  },
  "status" : 403
}

这时可以通过以下操作进行解除:

curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

产品栈

除了Elasticsearch,elastic公司还开发了一系列相关产品:

  • Kibana,前端控制台,可以管理和可视化数据
  • Logstash,可以对日志文件进行收集和处理并传到elasticsearch里
  • Beats,从服务端收集日志、网络、监控数据的代理程序
  • Elastic Cloud,一站式SaaS订阅服务
]]>