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

Posted

技术标签:

【中文标题】Apple 如何在电子邮件中查找日期、时间和地址?【英文标题】:How does Apple find dates, times and addresses in emails? 【发布时间】:2012-03-06 21:15:30 【问题描述】:

ios 电子邮件客户端中,当电子邮件包含日期、时间或位置时,文本会变成超链接,只需点击链接即可创建约会或查看地图。它不仅适用于英语电子邮件,也适用于其他语言。我喜欢这个功能,并想了解他们是如何做到的。

实现这一点的天真的方法是拥有许多正则表达式并运行它们。但是我这不会很好地扩展,并且只适用于特定的语言或日期格式等。我认为苹果必须使用机器学习的一些概念来提取实体(8:00PM、8PM、8:00、 0800、20:00、20h、20h00、2000 等)。

知道 Apple 是如何在其电子邮件客户端中如此快速地提取实体的吗?你会应用什么机器学习算法来完成这样的任务?

【问题讨论】:

我也想过这个,尤其是正则表达式技巧。我知道他们有专利,所以也许你可以尝试搜索它。但是,我也会对此非常感兴趣。 +1 实际上正则表达式技巧可能会以非常低的错误率捕获 99% 的情况。当您优化正则表达式时,速度非常快。因此,如果它确实只是一组正则表达式,我不会感到惊讶。 【参考方案1】:

他们可能为此使用Information Extraction 技术。

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

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

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

numberOfLetters numberOfSymbols 长度 previousWord 下一个单词 nextWordNumberOfSymbols ...

然后用一个分类算法,给它正反两例:

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”... 下一个单词在“第十二”,any_number ... 然后是日期

这是一位 Google 工程师就该主题撰写的 decent video

【讨论】:

el 主任,在您看来,什么样的模型最适合呢?贝叶斯? 我很确定这种方法的性能不会比大约 f 测量更好。 0.9。 (注意,这只是一种感觉,我可能错了)。另一方面,除了编码所有常见格式以更好地执行(可能是 0.99+,因为永远不会错过最常见的格式)并在运行时更快地实现 + 的天真方法。 @b.buchhold,也许可以,但是你必须为下一种语言和下一种语言做同样多的工作,而我的解决方案是通用的。 @Neil McGuigan,真的。但是你必须为所有这些格式/语言提供大量的训练数据,这需要更多的工作。 @NeilMcGuigan 非常感谢您的回答。我做了你上面提到的,但无法弄清楚如何训练这些数据和使用哪种算法。我不能使用决策树,因为属性类型不同【参考方案2】:

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

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

本质上,它解析文本并检测代表特定数据片段的模式,然后对其应用操作系统上下文操作。很整洁。

【讨论】:

这是正确答案。其他答案可能会告诉您如何做到这一点,但这个答案会告诉您 Apple 是如何做到的 我们可以在文章中提供更多细节吗?单个链接条目没有添加那么多 啊,这就是我网站上所有点击量的来源:) FWIW,在 ATG 时代,我是 Apple Data Detectors 的项目负责人;我可以在这里补充的是,这只是 OS 8 和 9 的技术——它从未跳到 OS X。显然在 OS X 和 IOS 中发生了一些类似的事情,而且,虽然我不再在 Apple所以不能说,如果架构有点不同,我不会感到惊讶。尽管如此,我希望某种语法/解析器系统仍然是它的核心。现在的计算机速度很快,简单的语法也很便宜。【参考方案3】:

这称为时态表达式识别和解析。以下是一些帮助您入门的 Google 搜索:

https://www.google.com/#hl=en&safe=off&sclient=psy-ab&q=timebank+timeml+timex

https://www.google.com/#hl=en&safe=off&sclient=psy-ab&q=temporal+expression+tagger

【讨论】:

+1 表示在一些/大部分文献中“识别涉及时间的表达”的名称是什么【参考方案4】:

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

【讨论】:

看来NSDataDetector 类是Apple 为实现这一点所付出的努力的结果。问题是这个类在内部是如何工作的? 它在 NSRegularExpression.h 中,所以正如所指出的,它似乎很可能只是一组正则表达式。【参考方案5】:

我曾经使用 pyparsing 编写了一个解析器来执行此操作。这真的很简单,你只需要把所有不同的方法都弄对,但没有那么多。只用了几个小时,而且速度非常快。

【讨论】:

Extract from Miramontes "硬编码一个诸如 URL 之类的原子结构的识别器并不难,但需要大量的工作来构建一个打开创建复杂结构过程的体系结构。 "【参考方案6】:

Apple 拥有关于他们如何做到这一点的专利System and method for performing an action on a structure in computer data,这里有一个关于这项专利的故事apples-patent-on-nsdatadetector

【讨论】:

以上是关于Apple 如何在电子邮件中查找日期、时间和地址?的主要内容,如果未能解决你的问题,请参考以下文章

接受与 Apple ID 不同的电子邮件地址的 TestFlight 邀请?

在特定子字符串和分号之间查找电子邮件地址

如何在 C# 中使用 AD 组名称查找 Active Directory 组电子邮件地址

如何查找电子邮件转发到的电子邮件地址(在 MimeKit 中)

在 SQL 中查找最后更新的值

如何撤销使用 Apple 登录特定应用程序的凭据?