【问题标题】:How to recognize words in text with non-word tokens?如何识别带有非单词标记的文本中的单词?
【发布时间】:2010-01-03 12:53:58
【问题描述】:

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

【问题讨论】:

    标签: algorithm nlp lexical-analysis


    【解决方案1】:

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

    • 单词可以以大写字母开头,也可以全部为大写字母,但如果您在一个单词中包含超过 2 个大写字母和 2 个以上小写字母,则它不是单词
    • 如果单词中有数字,则不是单词
    • 如果超过 20 个字符

    没有魔术。你需要决定你想要的规则是什么并实现它们。

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

    【讨论】:

    • 感谢您的建议,我是这样开始的,然后我计算了 NrLetterToDigitChanges 和 NrLowerToUpperChnages,然后我为 NrLowerToUpperChnages
    • 确保你写出体面的文档,因为这些名字对普通读者来说意义不大。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      虽然我一般同意 shoosh 的回答,但他的方法很容易实现高召回率但也很容易实现低精度,即你会得到几乎所有真实的单词,但也有很多非单词。如果您对单词的定义过于严格,则相反,但这也不是您想要的,因为那时您会错过像“zebra123”这样的情况。所以这里有一些关于如何提高精度的想法:

      1. 如果您可以确定电子邮件的哪些部分属于正文以及哪些部分是像 pgp 签名这样的页脚,这可能是值得考虑的。我确信可以找到一些与大多数情况相匹配的简单启发式方法,例如剪切仅包含“-”字符的行下方的所有内容。

      2. 根据您的性能标准,您可能希望通过匹配一个简单的单词列表来检查一个单词是真实单词还是包含真实单词。在网络上很容易找到非常详尽的英语单词列表,您也可以通过从一个大而干净的文本语料库中提取单词来自己编译。

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

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

      如果这些建议显然不适用于像“zebra123”这样的情况。同样,简单地切断或拆分字内数字可能会奏效。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-28
        • 1970-01-01
        • 1970-01-01
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-08
        相关资源
        最近更新 更多