1.3 自动编码格物致知。――中国谚语
编码用于非结构化文本数据,是用与标准术语中的同义词一致的标识符代码标记词条的过程(见术语表,Identifier)。例如,医学术语中可能包含词条肾细胞癌(一种肾癌),附加一个唯一的标识符代码给这个术语,例如“C9385000”。肾细胞癌大约有50个同义词,这里列出一部分同义词和近义词:adenocarcinoma arising from kidney、adenocarcinoma involving kidney、cancer arising from kdney、carcinoma of kidney、Grawitz tumor、Grawitz tumour、hypernephroid tumor、hypernephroma、kidney adenocarcinoma、renal adenocarcinoma以及renal cell carcinoma。所有的这些术语都可以用同样的代码“C9385000”。对一篇文本文档进行自动编码的过程包括:找到属于某个特定术语中的全部词条,用对应的标识代码标记这些词条。术语是特殊的词汇表,通常包含涵盖某个边界明确的领域的全部词条(见术语表,Vocabulary),例如,疾病、天体、汽车品牌和型号等。一些术语是以字母顺序排序的,也有一些是按照同义词来排序的,同义词和近义词(见术语表,Plesionymy)是根据某种标准(例如,最佳或是优先级)来收集的。同义词目录常由于多义词的存在而变得麻烦(见术语表,Polysemy)。在很多术语集中,为同义词分配同一个代码(例如,某个独特的字符串;见术语表,Uniqueness,String)。术语集有很多用处:加强互操作性和集成性,允许在查询时获取全部同义词信息,支持对文本数据的复杂分析,描述细节,在文本文档中标注信息,通过整合同义词的统一编码降低文本复杂度。对于存在于多个大数据资源中的大量文档而言,如果能够为文档中出现的所有术语进行术语词条到词条编码的替换和增补,那么这些文档就具备了一致性。在肾细胞癌的例子中,如果在某个医疗文本中出现的所有50多个同义词词条都被编码为“C9385000”,那么不论查询哪个同义词,搜索引擎都能够检索包含这个代码的全部文档。例如,检索Grawitz tumor,检索出来的文档也将包含“hypernephroid tumor”这个词,这是因为检索引擎会简单地将检索词“Grawitz tumor”翻译成代码“C9385000”,然后推送标注有该代码的全部记录。传统上的术语编码很像语言翻译,一直被认为是最好由人类来完成的一种专业和高度细致的工作。不仅有经过高度训练的翻译工具会给出通俗文本的外文版本,也有训练有素的、熟练掌握特定术语集的程序员会创建标记后的文档版本。给文档标记术语代码是一项重要工作。如果编码存在缺陷,后果将不堪设想。2009年,美国退伍军人事务部(VA)发出了上百封邮件,告知退伍军人他们患上了肌萎缩侧索硬化症,也称为葛雷克氏症,这是一种致命的神经衰退疾病。然而事实上,大约600个收件人并没有该疾病。VA后来收回了这些邮件,并指明这次的混乱是编码错误造成的12。程序员编码的前后不一致、个人习惯差异以及编码出错等问题,使得文本编码并不容易。人为编码的准确性似乎仅能达到85%~90%(见术语表,Accuracy,Precision)。人类没有足够的时间、金钱和人力来处理千兆字节和大量文本编码。计算机编码(即自动编码)是唯一可行的解决方案。自动编码是一种特殊的机器翻译形式,即在计算机科学领域处理从叙事文本汲取语义或是将叙事文本从一种语言翻译成另一种语言的任务。理所当然,自动编码算法直接采用机器翻译领域的相关算法,尤其是自然语言处理算法(见术语表,Algorithm)。常规的自动编码算法包括如下几个步骤:利用自然语言规则找出文本中的全部单词和词组,并将其与各个术语词条对照。理想情况下,正确无误的文本词条是与其对应的术语词条完全一致的,而不论其在文本中是以何种方式表达。例如,词条“adenocarcimoma of lung”有很多差别细微的替代词,如“adenocarcinoma of the lung”“adenocarcinoma of the lungs”“lung adenocarcinoma”和“adenocarcinoma found in the lung”。自然语言算法会考虑语法因素、允许的替代术语结构、词根和句法变异(见术语表,Syntax)。字符串相似性算法可以称得上是自然语言方法上的一个巧妙改进,当语法方法在判定词条等价性上不起作用时,字符串相似性算法就可以发挥作用了。当同义词词条缺少词源学上的共性时,自动编码会受到自然语言方法的一些限制。以词条“renal cell carcinoma”为例,它的同义词包含那些相互之间没有语法关系的词条。举个例子,“hypernephroma”和“Grawitz tumor”是“renal cell carcinoma”的同义词,我们无法通过自然语言规则或是单词相似度算法来计算这些词条的等价程度。那么,获取单词或词组之间的同义程度的唯一方法,是借助全面的、列出每个同义词的术语表。撇开无法为没有词根的同义术语构建共性不说,现有的最好的自然语言自动编码器运行速度很慢。究其原因与算法有关,算法通常最少包含以下几步:从语法上将文本分解成语句,再将语句分解成更小的语法单元,在语法上重新安排和组合句子的语法单元,在词干词汇上扩展句子,支持词语的奇异性和多元性,并对术语表中列出的词条在可接受变化范围内进行匹配。当前,自然语言自动编码器如果能每秒解析约1KB文本就是非常优秀的了。这意味着如果一个自动编码器必须解析和编码1TB的文本素材,则需要用10亿秒来处理,即约30年。而大数据资源的数据量通常有很多很多TB,因此,自然语言自动编码软件对处理大数据资源不适用。那么,既然如此,自动编码有何价值呢?自然语言自动编码器如果在数据输入时得以利用将产生极大价值。人类键入句子的速度远比1KB/s低得多,自然语言编码器能够与打字员的速度保持一致,并为每个输入的词条编码。还可以进行自动更正、自动拼写、多段预读以及其他常用支撑性行为,以改善和提升打字员的效率。通过自然语言算法可防止变体术语不被识别,如果一个打字员够精明,他会为应用程序提供一系列等价表达方式(如肾细胞癌renal cell carcinoma=rcc),这会帮助应用程序应对未来出现的更多的变体形式。如果我们在进行数据准备时用上了自然语言解析器,似乎可以突破那些自然语言处理算法的固有限制。这种理念是自然语言软件开发者和软件使用体验良好的用户所推崇的,但他们忽略了大数据资源必备的两条属性:寿命和综合处理(见术语表,Curator)。术语表并非一成不变。随着时间的推移,旧术语表的更新和新术语表的产生都会使同义词词条及其代码发生更改。在某些情况下,大数据中的文本材料需要进行重新注解,而凭借的术语编码也许涵盖了信息学领域新的、原先未预料到的编码。在这个信息爆炸的社会,大多数人已对数据的逐渐消失习以为常,因为一旦数据达到了其存在的最初目的,那么它就会被人类遗忘。我们并不会对所有电子邮件都永久保存,也不会因为删除了早期博客上的文章、Facebook上的留言以及Twitter上的推文而感到遗憾。再从医疗上说,病人信息、确诊诊断书和病理报告信息等仅需在几分钟、几小时、几天或者几个月中可用即可。也就是说我们很少会将文本信息保存几年甚至几十年。当我们存有超过几十年、可回溯的数据时,就可以找到以前出现过的错误,避免这些错误再次出现,也可以利用这些数据进行趋势分析,指导未来的发展。为了保存数据的价值,我们必须对数据进行持续管理,添加适用于现有术语表的代码。有些琐事无法避免―一次又一次地记录整个大数据资源中的语料库,使用修改版本的术语表或者使用新的术语表。这就需要自动编码应用程序迅速地对大量文本数据(可能达到TB级)进行编码。自然语言算法很大程度上依赖正则表达式操作(例如,寻找文本中的字模式),且自然语言算法过慢的计算速度已无法胜任上述工作(见术语表,Regex)。还有一种更快的方法是所谓的词法解析。这涉及逐字逐句地解析文本,计算同一个术语表中的词或词条之间的匹配程度。当发生匹配时,文本中的词汇会被分配到与术语表中匹配的词汇相对应的代码。以句子“margins positive malignant melanoma”为例,其自动编码算法策略是,首先你会使用一个列出人类遇到的所有肿瘤的术语表,让我们假设术语“malignant melanoma”和“melanoma”都已经包含在这个术语表中,且代码相同,如“Q5673013”,这是因为编写术语表的人认为这两者物理等效。现在,让我们开始自动编码“margins positive malignant melanoma”这句话:1.一次一个单词,开始解析句子。第一个单词“margins”,依照术语表没有找到匹配术语,保存该单词,进行下一步。2.第二个单词“positive”,同样在术语表中没有找到匹配术语。于是同时检索前一个单词与这个单词“margins positive”,也许这两个单词是一个术语,但结论还是no,保存单词“margins”和“positive”,继续下一步。3.第三个单词“malignant”,术语表中也没有匹配术语。再看看两个词“positive malignant”和三个词“margins positive malignant”是否有匹配术语,结果还是没有。4.第四个单词“melanoma”,发现在术语表中。再检查两个单词“malignant melanoma”、三个单词“positive malignant melanoma”、四个单词“margins positive malignant melanoma”,发现术语表中有“malignant melanoma”的匹配术语,但与“melanoma”的代码相同。5.自动编码器给这个句子附加代码“Q5673013”,并继续下一个句子,重复该算法。这个算法看似工作量较大,且需要多次对比,但实际上它比自然语言解析更为高效。所有术语词条有对应代码的术语表,在数据暂存器中可存储为一个变量(见术语表,Variable),查询速度也会更快。恰好有些方法比我们的示例算法速度更快,我先前发表的处理文本的方法能够做到比自然语言算法快1000倍14。如今,电脑计算速度更快,在限定时间内,自动编码能够实现对大部分的数据资源中的文本数据进行编码的任务。如果分析师必须集成两个相互独立的大数据资源,且各自的术语表完全不同,这时就会有些棘手。一个可行的解决方案是动态编码,而不管哪个术语表才能满足分析师的分析目的。这里给出一个常用的动态编码算法15:首先,在任意一个大数据资源集合中,用任意一个方便的术语表找到查询词的所有同义词。具体如下:1.分析师以数据用户提交的查询词开始编码过程。分析师首先选择一个包含查询词及其同义词的术语表,术语表只要是由词条-代码对组成,且同义词的代码一致即可。2.收集查询词的所有同义词。例如,一份2004版流行的医学术语表―统一医学语言系统,代码为C0206708的词条有38个,其中9个如下:
如果分析师对“Cervical Intraepithelial Neoplasia”进行搜索,那么,该词条是这个术语表中的38个同义词之一。3.一个接一个地对等价术语词条与分析师所掌握的大数据资源中的每个记录进行匹配。4.提取出那些包含与查询词及其同义词相匹配的所有记录条目。在上面这个案例中,在寻找整个数据记录中与“Cervical Intraepithelial Neoplasms”相匹配的词条时,对其他37个同义词也进行了匹配查询。这种搜索的优点是:在数据记录中检索查询词时,也可以检索出其同义词,这里没有预编码,也不会检索那些分析师不关心的术语词条;缺点是:计算速度会因为同义词过多而变慢。幸运的是,存在简单且快速的同义词搜索方法15。
相关资源:《应有格物致知精神》教案语文教案_精选.doc