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

时间:2010-01-03 12:53:58

标签: algorithm nlp lexical-analysis

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

3 个答案:

答案 0 :(得分:3)

你需要为一个单词决定一个足够好的标准,并写一个正则表达式或一个手册来强制执行它 可以从您的示例中推断出一些规则:

  • 单词可以以大写字母开头,也可以全部是大写字母,但如果你有一个单词内有2个大写字母和2个小写字母,那么这不是一个单词
  • 如果你的单词中有数字,那就不是一个单词
  • 如果比说长20个字符

没有魔术。你需要决定你想要的规则,并让它们成为现实。

另一种方法是训练某种隐马尔可夫模型系统来识别听起来像单词的东西,但我认为这对你想做的事情来说太过分了。

答案 1 :(得分:1)

http://en.wikipedia.org/wiki/English_words_with_uncommon_properties
您可以制定拒绝任何具有这些“不常见属性”的规则来构建一个接受实际单词的系统

答案 2 :(得分:1)

虽然我普遍同意shoosh的回答,但是他的方法很容易实现高回忆率而且精度低,即你几乎可以获得所有真实的单词,但也可以获得很多非单词。如果你对单词的定义过于严格,那就是另一种方式,但这也不是你想要的,因为那时你会错过像'zebra123'这样的情况。所以这里有一些关于如何提高精度的想法:

  1. 如果您可以确定电子邮件的哪些部分属于主要文本以及哪些是pgp签名等页脚,则可能值得考虑。我确信有可能找到一些与大多数情况相匹配的简单启发式方法,例如:切割一行只包含'-'-字符的行。

  2. 根据您的效果标准,您可能需要通过匹配简单的单词列表来检查单词是真词还是包含真词。很容易在网上找到相当详尽的Englisch单词列表,你也可以通过从一个大而干净的文本语料库中提取单词来自己编译一个。

  3. 使用词法分析器,您可以过滤标记为未知的每个标记。

  4. 一些简单的统计数据可能会告诉您某事物是一个单词的可能性有多大。高频率出现的标记最有可能是单词。仅出现一次或其数量低于某个阈值的令牌很可能不是单词。常见的拼写错误应该出现多次,而不常见的拼写错误可能会被忽略。

  5. 如果这些建议明显不适用于像'zebra123'这样的案例。再一次,简单地切断或拆分字内数字可能会成功。

    我的一般方法是首先识别肯定是单词的标记(使用上面的建议),然后识别肯定不是单词的标记(使用正则表达式),然后(用你的眼睛)看几百个或者数千个剩余的代币,以找到共同的特征来单独处理这些代币。