我目前正在解析一堆邮件,并希望从中获取单词和其他有趣的标记(即使有拼写错误或字符和字母的组合,例如“zebra21”或“customer242”)。但是,我如何知道“0013lCnUieIquYjSuIA”和“anr5Brru2lLngOiEAVk1BTjN”不是单词,也不相关?如何提取单词并丢弃编码错误或pgp签名的部分或我们在邮件中获得的其他内容,并知道我们永远不会对这些内容感兴趣?
我目前正在解析一堆邮件,并希望从中获取单词和其他有趣的标记(即使有拼写错误或字符和字母的组合,例如“zebra21”或“customer242”)。但是,我如何知道“0013lCnUieIquYjSuIA”和“anr5Brru2lLngOiEAVk1BTjN”不是单词,也不相关?如何提取单词并丢弃编码错误或pgp签名的部分或我们在邮件中获得的其他内容,并知道我们永远不会对这些内容感兴趣?
http://en.wikipedia.org/wiki/English_words_with_uncommon_properties
你可以制定规则,拒绝任何具有这些“不寻常属性”的单词,以构建一个接受大多数实际单词的系统。
虽然我基本上同意shoosh的答案,但他的方法容易实现高查全率但低查准率,即你会得到几乎所有真实单词,但也会得到很多非单词。如果您对单词的定义过于严格,那么情况就恰好相反,但这也不是您想要的,因为那样您会错过像“zebra123”这样的情况。因此,以下是一些提高查准率的想法:
1. 可以考虑确定电子邮件的哪些部分属于主文本,哪些部分是页脚(如pgp签名),这可能很值得思考。我相信可以找到一些简单的启发式规则,匹配大多数情况,例如截取以下只包含“-”字符的行以下的所有内容。 2. 根据性能标准,您可能希望通过与简单的单词列表进行匹配来检查单词是否为真实单词或包含真实单词。在网上很容易找到相当详尽的英语单词列表,您也可以通过从大型干净的文本语料库中提取单词来编译一个自己的列表。 3. 使用词法分析器,您可以过滤掉标记为未知的每个标记。 4. 一些简单的统计数据可以告诉您某些东西是单词的可能性有多高。高频出现的标记很可能是单词。仅出现一次或数量低于某个阈值的标记极有可能不是单词。常见的拼写错误应该会出现多次,不常见的错误可以忽略。 这些建议显然不适用于像"zebra123"这样的情况。再次强调,仅仅截取或分割包含数字的单词可能就能解决问题。我的一般方法是首先识别那些肯定是单词的标记(使用上述建议),然后识别那些肯定不是单词的标记(使用正则表达式),最后浏览剩余的几百或几千个标记,找到共同的特征来分别处理它们。