苹果如何在电子邮件中查找日期、时间和地址?

133
在iOS邮件客户端中,当电子邮件包含日期、时间或位置时,文本将变成超链接,只需点击链接即可创建约会或查看地图。这不仅适用于英语邮件,也适用于其他语言。我喜欢这个功能,想了解他们是如何实现的。
一种朴素的方法是使用许多正则表达式并运行它们全部。但是,这种方法不会很好地扩展,并且仅适用于特定的语言或日期格式等。我认为苹果必须使用某种机器学习概念来提取实体(例如8:00PM、8PM、8:00、0800、20:00、20h、20h00、2000等)。
有没有想法,苹果在其电子邮件客户端中如何能够快速提取实体?你会应用什么机器学习算法来完成这样的任务?

5
我也考虑过这个问题,特别是正则表达式技巧。我知道他们对此有专利,所以也许你可以尝试搜索一下。不过,我也对它很感兴趣,+1。 - Thomas Jungblut
15
实际上,正则表达式的技巧很可能会捕获99%的情况,而且错误率非常低。当你优化正则表达式时,速度非常快。所以,如果它确实只是一组正则表达式,那我不会感到惊讶。 - Has QUIT--Anony-Mousse
6个回答

155

他们可能使用信息提取技术来实现这一点。

以下是斯坦福大学的SUTime工具演示:

http://nlp.stanford.edu:8080/sutime/process

您将从文档中提取关于n-gram(连续单词)的属性:

  • 字母数
  • 符号数
  • 长度
  • 前一个单词
  • 后一个单词
  • 后一个单词的符号数
    ...

然后使用分类算法,并提供正面和负面的例子进行训练:

Observation  nLetters  nSymbols  length  prevWord  nextWord isPartOfDate  
"Feb."       3         1         4       "Wed"     "29th"   TRUE  
"DEC"        3         0         3       "company" "went"   FALSE  
...

你可能只需要50个每种的例子,但是越多越好。然后,算法会根据这些例子进行学习,并可以应用于它以前没有见过的未来例子。

它可能会学习到以下规则:

  • 如果前一个单词只包含字符和句号...
  • 并且当前单词是"february"、"mar."、"the"之类的词...
  • 并且下一个单词是"twelfth"、任何数字之类的词...
  • 那么就是日期

这里有一位谷歌工程师关于这个主题的不错的视频


2
El Chief,您认为哪种模型最适合呢?贝叶斯模型? - Martin
6
我很确定这种方法的表现不会比如 F-度量约为0.9 的表现更好。(请注意,这只是一种感觉,我可能是错误的)。另一方面,我期望编码所有常见格式的朴素方法会表现得更好(可能达到0.99+,因为最常见的格式永远不会被错过),并且在实现和运行时速度上更快。 - b.buchhold
@b.buchhold,也许是这样,但是你必须为下一种语言和下一种语言做同样的工作,而我的解决方案是通用的。 - Neil McGuigan
@Neil McGuigan,没错。但是你需要提供大量的训练数据来支持所有这些格式/语言,这需要更多的工作。 - b.buchhold
@NeilMcGuigan 非常感谢您的回答。我按照您上面提到的方法做了,但是不知道如何训练这些数据以及使用哪种算法。由于属性类型不同,我无法使用决策树。 - chopss

117

这其实是苹果很久以前开发的一项技术,称为Apple Data Detectors。您可以在此处阅读更多相关信息:

http://www.miramontes.com/writing/add-cacm/

基本上,它会解析文本并检测代表特定数据的模式,然后对其应用操作系统上下文相关的动作。非常不错。


25
这是正确的答案。其他答案可能会告诉你如何去做,但这个答案告诉你苹果是如何做的。 - LaC
2
我们能否在写作中再加入一些细节呢?单个链接条目并不能提供太多信息。 - shigeta
15
啊,这就是我的网站点击量来自的地方啊 :) 顺便说一下,我曾经是ATG时代苹果数据探测器项目的负责人;我可以在这里补充的是,这是仅限于OS 8和9技术,从未跳转到OS X。显然,在OS X和IOS中有类似的事情发生,虽然我已经不在苹果工作了,所以不能确切地说,但我不会对架构有所惊讶。尽管如此,我仍然期望某种语法/解析器系统仍然是其中的核心。现在电脑的速度很快,而简单的语法也非常便宜。 - Jim Miller

21

1
在一些/大部分文献中,"指代时间的表达式"的名称是什么? - arturomp

7

谜题的一部分可能是NSDataDetector类。它被用于识别一些标准类型,例如电话号码。


2
看起来NSDataDetector类是苹果为了实现这个功能而付出的努力的结果。问题在于这个类如何内部工作? - Ole Begemann
4
它在NSRegularExpression.h中,因此很可能就像提出的那样,只是一组正则表达式。 - riffraff

3

我曾经使用pyparsing编写过一个解析器来实现这个功能。它非常简单,你只需要正确地处理所有不同的方式,但并不多。这只花了几个小时,并且速度相当快。


Miramontes中提取:“对于像URL这样的原子结构硬编码识别器并不困难,但需要大量工作来设计一种架构,以打开创建复杂结构的过程。” - Remy

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接