如何识别带有非单词标记的文本中的单词?

7

我目前正在解析一堆邮件,并希望从中获取单词和其他有趣的标记(即使有拼写错误或字符和字母的组合,例如“zebra21”或“customer242”)。但是,我如何知道“0013lCnUieIquYjSuIA”和“anr5Brru2lLngOiEAVk1BTjN”不是单词,也不相关?如何提取单词并丢弃编码错误或pgp签名的部分或我们在邮件中获得的其他内容,并知道我们永远不会对这些内容感兴趣?

3个回答

3
你需要确定一个足够好的单词标准,并编写一个正则表达式或手动操作来强制执行它。
以下是从你的例子中可以推导出来的一些规则:
  • 单词可以以大写字母开头或全部由大写字母组成,但如果单词内有超过2个大写字母和2个小写字母,则不是单词。
  • 如果单词内有数字,则不是单词。
  • 如果长度超过20个字符
没有什么魔法。你需要决定你想要什么规则并使它们发生作用。
另一种方法是训练某种隐藏马尔可夫模型系统来识别听起来像单词的东西,但我认为这对于你想做的事情来说太过于复杂了。

谢谢建议,我是这样开始的,然后计算了字母与数字转换次数和小写字母到大写字母转换次数,接着创建了不同的“级别”单词。目前我为NrLowerToUpperChnages <= 1和NrLetterToDigitChanges <= 1设置了第一级别。如果两者之和大于8,则不是一个单词。因此,我将定义更多级别,并查看哪种方法最适合我。谢谢 - zebra
1
请确保编写良好的文档,因为这些名称对于普通读者来说并没有太多意义。 - shoosh

1

1

虽然我基本上同意shoosh的答案,但他的方法容易实现高查全率但低查准率,即你会得到几乎所有真实单词,但也会得到很多非单词。如果您对单词的定义过于严格,那么情况就恰好相反,但这也不是您想要的,因为那样您会错过像“zebra123”这样的情况。因此,以下是一些提高查准率的想法:

1. 可以考虑确定电子邮件的哪些部分属于主文本,哪些部分是页脚(如pgp签名),这可能很值得思考。我相信可以找到一些简单的启发式规则,匹配大多数情况,例如截取以下只包含“-”字符的行以下的所有内容。 2. 根据性能标准,您可能希望通过与简单的单词列表进行匹配来检查单词是否为真实单词或包含真实单词。在网上很容易找到相当详尽的英语单词列表,您也可以通过从大型干净的文本语料库中提取单词来编译一个自己的列表。 3. 使用词法分析器,您可以过滤掉标记为未知的每个标记。 4. 一些简单的统计数据可以告诉您某些东西是单词的可能性有多高。高频出现的标记很可能是单词。仅出现一次或数量低于某个阈值的标记极有可能不是单词。常见的拼写错误应该会出现多次,不常见的错误可以忽略。 这些建议显然不适用于像"zebra123"这样的情况。再次强调,仅仅截取或分割包含数字的单词可能就能解决问题。

我的一般方法是首先识别那些肯定是单词的标记(使用上述建议),然后识别那些肯定不是单词的标记(使用正则表达式),最后浏览剩余的几百或几千个标记,找到共同的特征来分别处理它们。


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