2

テキストの正規化を目的として、大規模な検索を実行し、ドキュメント間で置換できるようにしたいと考えています。

例えば:

  1. USAUSAのすべての用途を検索し、 United StatesOfAmericaに置き換えます
  2. すべてのアンパサンド(&)を検索し、単語とに置き換えます

また、コードを変更せずにシステムに新しいルールを追加できるようにしたいと考えています。したがって、検索置換ペアはデータストアに保存されます。つまり、誰でもルールを追加、更新、削除できます。

私はPythonreモジュールを使用してきましたが、これは非常に優れており、理想的には、タプルのリストをsubコマンドに渡して、それぞれを調べて置換を実行したいと思います。タプルのリストを繰り返し処理してから、それぞれに正規表現を作成する以外に、これを行うためのより良い方法はありますか?特に大きなドキュメントでは、非常に遅く、非効率的です。

replacements = [
  r('USA','United States Of America'),
  (r'U\.S\.A','United States Of America'),
  (r'US of A', 'United States of America')]

for replacement in replacements:
  document = re.sub(replacement[0],replacement[1],document
4

3 に答える 3

1

あなたの例はどれも正規表現を必要としません。古き良き文字列の交換を試してみませんか?

replacements = [
    ('USA','United States Of America'),
    ('U\.S\.A','United States Of America'),
    ('US of A', 'United States of America')]

for replacement in replacements:
    document = document.replace(replacement[0], replacement[1])

それは遅いように思えますが、アプローチを除外する前にベンチマークする必要があります。Python はこのような作業に非常に優れており、その結果に驚くかもしれません。

正規表現が本当に必要な場合は、それらをコンパイルすることで大幅に改善される可能性があります。

replacements = [
    (re.compile('USA'),'United States Of America'),
    (re.compile('U\.S\.A'),'United States Of America'),
    (re.compile('US of A'), 'United States of America')]

for pattern, replacement in replacements:
    document = pattern.sub(replacement, document)

これにより、Python は正規表現を使用するたびに再コンパイルする手間を省くことができます。

ときどき正規表現だけが必要な場合は、ドキュメントを 2 回通過させることを検討してください。1 回は正規表現を使用し、もう 1 回は文字列置換を使用します。または、置換の特定の順序が必要な場合は、次のようにすることができます。

replacements = [
    (re.compile('USA'),'United States Of America'),
    ('foo', 'bar'),
    (re.compile('U\.S\.A'),'United States Of America'),
    ('spam', 'eggs'),
    (re.compile('US of A'), 'United States of America')]

for pattern, replacement in replacements:
    try:
        document = pattern.sub(replacement, document)
    except AttributeError:
        document = document.replace(pattern, replacement)
于 2012-05-22T15:00:04.930 に答える
0

Google Refine を参照してください。

乱雑なデータを処理するための強力なツールである Google Refine

http://code.google.com/p/google-refine/

于 2012-05-22T14:54:49.473 に答える
0

6 MB のテキストを含むBig Ass ファイルがあります。これは、いくつかの Project Gutenberg ファイルをまとめたものです。

これを試す:

reps = [
  (r'\bthousand\b','>>>>>1,000<<<<<'),
  (r'\bmillion\b',">>>>>1e6<<<<<"),
  (r'\b[Hh]undreds\b',">>>>>100's<<<<<"),
  (r'\bSherlock\b', ">>>> SHERLOCK <<<<")
  ]

t1=time.time()
out=[]  
rsMade=0
textLength=0
NewTextLen=0
with open('big.txt') as BigAssF:
    for line in BigAssF:
        textLength+=len(line)
        for pat, rep in reps:
            NewLine=re.subn(pat,rep,line)     

        out.append(NewLine[0])
        NewTextLen+=len(NewLine[0])
        rsMade+=NewLine[1]

print 'Text Length: {:,} characters'.format(textLength)
print 'New Text Length: {:,} characters'.format(NewTextLen)     
print 'Replacements Made: {}'.format(rsMade)     
print 'took {:.4} seconds'.format(time.time()-t1) 

それは印刷します:

Text Length: 6,488,666 characters
New Text Length: 6,489,626 characters
Replacements Made: 96
took 2.22 seconds

これは私には十分に速いようです。

コード行に問題がある可能性があります。

document = re.sub(replacement[0],replacement[1],document

それがタイプミスでなければ。

どのくらいの速度になると思いますか?

于 2012-05-22T17:15:03.837 に答える