1

これは、特定のルールに従ってテキストをトークン化し、トークンにラベルを付ける単純なスキャナーです。

  1. 不明な文字を処理し、不明としてラベル付けするための最良の方法は何ですか?
  2. 同様の結果を達成し、比較的単純なままで物事をスピードアップするための推奨される方法/ライブラリはありますか?

例:

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!定義された関数は、おそらくトークンをさらに分類しようとします。

4

1 に答える 1

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で、1つはstrです。Python2 では、一致するパターンと文字列が または のいずれかになることは事実unicodeですstr

ただし、Python3 では:

Unicode 文字列と 8 ビット文字列を混在させることはできません。つまり、Unicode 文字列をバイト パターンと照合したり、その逆を行ったりすることはできません。

したがって、Python2 であっても、それらを混在させないことをお勧めします。


あなたのコードは素晴らしくシンプルだと思います (regex を除いてsuperscript。Eek!)。私はそれをもっと簡単にするライブラリを知りません。

于 2013-01-16T13:32:33.043 に答える