我目前正在解析一堆邮件,并希望从邮件中获取单词和其他有趣的标记(即使有拼写错误或字符和字母的组合,如“zebra21”或“customer242”)。但是我怎么知道“0013lCnUieIquYjSuIA”和“anr5Brru2lLngOiEAVk1BTjN”不是单词并且不相关?如何提取单词并丢弃编码错误或部分 pgp 签名的令牌或我们在邮件中收到的任何其他内容,并且知道我们永远不会对这些感兴趣?
3 回答
您需要为一个词确定一个足够好的标准并编写一个正则表达式或手册来强制执行它。
可以从您的示例中推断出一些规则:
- 单词可以以大写字母开头或全部为大写字母,但如果您在一个单词中不止说 2 个大写字母和 2 个以上小写字母,则它不是单词
- 如果单词中有数字,则不是单词
- 如果超过 20 个字符
没有魔术。你需要决定你想要的规则是什么,并让它们发生。
另一种方法是训练某种隐马尔可夫模型系统来识别听起来像单词的东西,但我认为这对于你想要做的事情来说太过分了。
http://en.wikipedia.org/wiki/English_words_with_uncommon_properties
您可以制定规则拒绝任何具有这些“不常见属性”的内容,以构建一个接受大多数实际单词的系统
虽然我一般同意 shoosh 的回答,但他的方法很容易实现高召回率但也很容易实现低精度,即你会得到几乎所有真实的单词,但也有很多非单词。如果您对单词的定义过于严格,则相反,但这也不是您想要的,因为那时您会错过像“zebra123”这样的情况。所以这里有一些关于如何提高精度的想法:
如果您可以确定电子邮件的哪些部分属于正文以及哪些部分是像 pgp 签名这样的页脚,则可能值得考虑。我确信有可能找到一些与大多数情况相匹配的简单启发式方法,例如,在仅包含“-”字符的行下方剪切所有内容。
根据您的性能标准,您可能希望通过匹配一个简单的单词列表来检查一个单词是真实单词还是包含真实单词。在网上很容易找到非常详尽的英语单词列表,您也可以通过从一个大而干净的文本语料库中提取单词来自己编译一个。
使用词法分析器,您可以过滤每个标记为未知的标记。
一些简单的统计数据可能会告诉您某事物是一个词的可能性有多大。高频出现的记号很可能是单词。仅出现一次或数量低于某个阈值的标记很可能不是单词。常见的拼写错误应该出现不止一次,不常见的可以忽略。
如果这些建议显然不适用于像“zebra123”这样的情况。同样,简单地切断或拆分字内数字可能会奏效。
我的一般方法是首先识别肯定是单词的标记(使用上面的建议),然后识别肯定不是单词的标记(使用正则表达式),然后(用你的眼睛)查看剩余的几百或几千个标记来找到共同的特征来分别处理这些。