标记和标记文本

时间:2013-01-16 13:12:19

标签: python nlp

这是一个简单的扫描程序,它根据特定规则对文本进行标记,并标记标记。

  1. 处理未知字符的最佳方法是什么,并将其标记为 未知?
  2. 是否有推荐的方式/库来加快速度 完成类似的结果并保持相对简单。
  3. 示例:

    import re
    
    def alpha(scanner,token):
        return token, 'a'
    
    def numeric(scanner,token):
        return token,'rn'
    
    def punctuation(scanner,token):
        return token, 'p'
    
    def superscript(scanner,token):
        return token, 'sn'
    
    scanner = re.Scanner([
        (u"[a-zA-Z]+", alpha),
        (u"[.,:;!?]", punctuation),
        (u"[0-9]+", numeric),
        (u"[\xb9\u2070\xb3\xb2\u2075\u2074\u2077\u2076\u2079\u2078]", superscript),
        (r"[\s\n]+", None), # whitespace, newline
        ])
    
    tokens, _ = scanner.scan("This is a little test? With 7,9 and 6.")
    print tokens
    

    出:

    [('This', 'a'), ('is', 'a'), ('a', 'a'), ('little', 'a'), ('test', 'a'),
     ('?', 'p'), ('With', 'a'), ('7', 'rn'), (',', 'p'), ('9', 'rn'), 
     ('and', 'a'), ('6', 'rn'), ('.', 'p')]
    

    ps!定义的函数可能会尝试进一步对标记进行分类。

1 个答案:

答案 0 :(得分:3)

re.Scanner符合所提供顺序的模式。因此,您可以在最后提供一个非常通用的模式来捕获“未知”字符:

(r".", unknown)

import re

def alpha(scanner,token):
    return token, 'a'

def numeric(scanner,token):
    return token,'rn'

def punctuation(scanner,token):
    return token, 'p'

def superscript(scanner,token):
    return token, 'sn'

def unknown(scanner,token):
    return token, 'uk'

scanner = re.Scanner([
    (r"[a-zA-Z]+", alpha),
    (r"[.,:;!?]", punctuation),
    (r"[0-9]+", numeric),
    (r"[\xb9\u2070\xb3\xb2\u2075\u2074\u2077\u2076\u2079\u2078]", superscript),
    (r"[\s\n]+", None), # whitespace, newline
    (r".", unknown)
    ])

tokens, _ = scanner.scan("This is a little test? With 7,9 and 6. \xa0-\xaf")
print tokens

产量

[('This', 'a'), ('is', 'a'), ('a', 'a'), ('little', 'a'), 
('test', 'a'), ('?', 'p'), ('With', 'a'), ('7', 'rn'), (',', 'p'), 
('9', 'rn'), ('and', 'a'), ('6', 'rn'), ('.', 'p'), ('\xa0', 'uk'), 
('-', 'uk'), ('\xaf', 'uk')]

您的部分模式为unicode,其中一种为str。确实,在Python2中,要匹配的模式和字符串可以是unicodestr

然而,in Python3

  

Unicode字符串和8位字符串不能混用:也就是说,你不能   将Unicode字符串与字节模式匹配,反之亦然

因此,即使在Python2中也不要混用它们。


我认为你的代码非常简单(除了superscript正则表达式.Eek!)。我不知道哪个库会让它变得更简单。