DVONthink To Go 和 DVONthink Pro 一样,搜索中文时存在水土不服的现象,尽管几年前就有系统内置的可以用于分词的接口 tokenizer(Pin 就是利用这个接口的范例),DEVONthink 系列产品仍然没有使用这些接口来强化其软件的索引能力。按理说,增加对文本进行一步处理很容易。我以前没写过 macOS 的应用程序,下载 Xcode,用了几天时间也写出来一个能用的 demo。GitHub 上相关的开源项目也不是不存在:lancy/StringTokenizer: iOS & Mac 分词(支持中文)

我曾试着写 Mac 上的脚本来生成索引,最后却发现大量的索引词把自己的文件搞得乱糟糟的,更何况在 iOS 设备上,没法部署我写的脚本,所以我仔细看了 DEVONthink 官方的说明文档,将其中的基础概念翻译了出来,有了此文。

关于翻译和简称

在不引起歧义的情况下,有如下简称:

  • DEVONthink To Go:DTTG
  • DEVONthink Mac 系列软件:DT
  • 称存储于 DTTG 中的任意(一个/多个)(文件/文件夹)为 项目

涉及到的若干名词,优先参照机器之心的编译表

分词简介

中文这样的非字母语言,其自然语言处理和英语这样的字母语言处理起来有不同之处。首先就是分词和词性标注,分词简单说是把句子中的词分开,不同的情况,还要考虑召回率、长词优先等策,词性标注顾名思义是标记词的词性。

分词没做好的会在语义上出现问题,就像果壳上的这个帖子。现代的分词技术已经取得了非常大的进步,但要解决的问题没有变,感兴趣的看以下两篇论文做些了解

当然,现在已经有不少成熟的包库能高效完成分词并标注这个工作了:

下面进入正题。

词组,字符与查询

原文是 WORDS, TOKENS, AND QURIES,直接翻译是词,字,与查询。但如上文说,中文和英语的处理逻辑存在不同,

  • 词组:由空格或标点字符分隔的字符串
  • 符号:DTTG 把全文索引存储为一个符号表。通常一个符号等同于一个词组
  • 短语:由 + 或者 " 包起来的符号
  • 查询:一个或多个符号通过逻辑操作符组合起来的

非字母,非数字的字符会被分割成一个短语。1234/5678 技术上会被处理为 1234 5678

大小写

符号是大小写敏感的;逻辑操作符必须是全部大小的。符号当然可以是大写,但是 DTTG 内部会将其大小写忽略的

大小写对于中文来说不那么重要

通配符

在 Mac 上,使用 DT 查询中文时,免不了使用 * 这样的符号来分隔查询的中文词语

DTTG 中默认是全匹配词组的(匹配由空格和标点字符分开的字符串,一般是一句话),而不是汉语中的一个词。在一个符号后接*,就能匹配所有以这个词开头的。但是和 Mac 上不一样的是,* 只能用来匹配前缀。比如

  • tDEVON 这个词,用 devon*devondevon**devon*无法匹配处理啊
  • 换到中文语境下,汉朝时苏武出访匈奴这句话,用*苏武苏武**苏武*无法搜索出这句话的

那什么时候是有用的呢:

  • DEVONthink TechnologyDEVONsearchDEVON*/devon* 可以搜索出来。
  • 大明苏武的内亚奇行记大明* 可以搜索出来

也就是说,对于中文而言,如果记得句子开头的中文词/字,这个方法才用得上

限定搜索范围

DTTG 中的项目,有着丰富的属性,称为作用域:

  • name:项目的名称
  • comment:项目的注释
  • content:项目的内容
  • tags:项目的标签

利用这些属性,可以逐步限定搜索范围,当它们和冒号 : 组合在一起时,便成为作用域前缀:

  • name: 仅在项目的名称中检索
  • comment: 仅在项目的注释中检索
  • content: 仅在项目中检索
  • tags: 仅在标签中检索

逻辑操作符

数学,或者编程中,或多或少会接触一些与集合论、逻辑相关的,比如并集,交集之类的。逻辑操作符就是在搜索中常用的,表明相邻两个查询指令间的逻辑关系

逻辑操作符只能是大写的。如果在搜索中没有说明使用的逻辑操作符,DTTG 默认是 AND

更进一步的使用还请参见文档

DTTG 中文搜索现状

就当下而言,简单如搜索 汉朝时苏武出访匈奴 这句话中的 苏武 一词都是不可行的,可以说非常悲观了。

所以,面对半残废的搜索,DTTG 中要想打造一套以中文为主的知识管理系统,最重要的就是不依赖于搜索。现阶段我是采用纯手工整理,用 itemlink 来链接有关系的文档。Mac 看情况用我自己的脚本来生成关键词,以备未来的检索

还是有点怀念用 Evernote 时强悍的中文索引能力的~