识别 HTML 页面上的结构化数据的最佳算法是什么?
例如,Google 会识别电子邮件中的家庭/公司地址,并提供该地址的地图。
识别 HTML 页面上的结构化数据的最佳算法是什么?
例如,Google 会识别电子邮件中的家庭/公司地址,并提供该地址的地图。
如果您还必须处理国际地址,那么您将进入一个令人头疼的世界;国际地址格式千差万别。
我猜谷歌对这个问题采取了两步走的方法(至少我会这样做)。首先,他们使用一些相当通用的搜索模式来挑选可能是地址的所有内容,然后他们使用他们的地图数据库查找该字符串并查看是否有任何匹配项。如果他们这样做,它可能是一个地址,如果他们不这样做,它可能不是。如果您可以在代码中使用地图数据库,那可能会让您的生活更轻松。
除非您可以限制地址的地理位置,否则我猜想仅通过解析将字符串识别为地址几乎是不可能的,这仅仅是因为世界各地使用的地址格式存在巨大差异。
不要使用正则表达式。使用现有的 HTML 解析器,例如在 Python 中我强烈推荐BeautifulSoup。即使您使用正则表达式来解析 BeautifulSoup 抓取的 HTML 元素。
如果你用自己的正则表达式来做,你不仅要担心找到你需要的数据,你还要担心无效的 HTML 之类的事情,以及许多其他你会偶然发现的非常不明显的问题。
如果你想让它变得完美,你所问的确实是一个相当困难的问题。虽然一个简单的正则表达式在大多数情况下大部分时间都是正确的,但编写一个每次都能完全正确的正则表达式非常困难。有很多奇怪的极端案例,在某些情况下,没有一个明确的答案。我见过的大多数网站在处理除了最简单的 URL 之外的所有内容都做得很糟糕。
如果你想走正则表达式路线,最好的办法可能是查看 http://metacpan.org/pod/Regexp::Common::URI::http的源代码
同样,正则表达式应该可以解决问题。
由于地址种类繁多,您只能通过“(数字),(名称)街道|大道|主”等表达式来猜测字符串是否为地址
您可以考虑查看一些 Firefox 扩展,这些扩展旨在映射在文本中找到的地址,以了解它们是如何工作的
对于电子邮件和联系方式,正则表达式绰绰有余。对于地址,单独的正则表达式将无济于事。想想 NLP(NER) 和 POS 标记。要查找与人相关的信息,如果没有 NER,您将无法做任何事情。