4

お金の表現を見つける必要がある数千行のテキストがあります。

Lorem ipsum dolor sit amet, 100.000,00 USD sadipscing elitr, sed diam nonumy eirmod 
GBP 400 ut labore et dolore magna aliquyam erat, sed diam voluptua. At USD 20 eos et 
accusam et justo duo dolores et 100,000.00 USD  ea rebum. Stet 3,-- USD gubergren, no 

Python スクリプトは、米ドルに換算された金額を返す必要があります。(例: 100000USF、400 GBP -> USD など)

これまでに行ったことは、数値と通貨の組み合わせの正規表現を手動で作成して値を取得し、通貨をデータベースと比較して交換を計算することでした。

ただし、これは効率的でも将来性もありません (たとえば、別の通貨が追加された場合)。そのため、いくつかの例で「トレーニング」できる効率的な機械学習アルゴリズムがあるかどうか疑問に思っています。 「組み合わせ?

4

3 に答える 3

3

人間は、頭字語が通貨かどうかを学習できますか? 新しい通貨が出現した場合、他の任意の頭字語とどのように区別できますか? 「1000 CPU」のようなものに出くわしたとします。CPU が何であるかを知らなければ、それが通貨であるか (または通貨ではない) かをどのように判断できますか?

自然言語処理を使用して、問題の数値の前後のコンテキストを調べることもできますが、より多くの処理が必要になり、確実に知ることはできません。

私の言いたいことは、この問題に対して、機械学習は適用可能であるとしてもやり過ぎです。

別の方法で行う方がはるかに簡単で正確であるのに、なぜ難しい方法で行うのでしょうか?

于 2013-03-03T09:40:02.890 に答える
2

問題は明確に定義されていませんが、機械学習は必要ありません。可能な通貨のセットは有限で小さく、通貨表現のセットは、正規表現として表現できないほど複雑になることはありません。正規表現の能力をフルに活用していないだけです。

たとえば、複数の通貨を一致させるには、次を使用します。

    currency = r"((USD)|(GBP)(...))"

次に、表現の数値部分を表現できます

    numbers = r"([0-9]+[0-9\.,]*)"

正規表現をコンパイルします。

    matcher = re.compile(numbers+r"[\s]*+"currency)

最初に通貨を照合する 2 番目のマッチャーを作成できます。オプションのキャプチャ グループなどで賢いものを使用できるかもしれませんが、パフォーマンスが大きな問題でない場合は、単純な 2 番目のマッチャーをお勧めします。

    matcher2 = re.compile(currency+r"[\s]*"+numbers)

「currency」正規表現は手動で作成する必要がないことに注意してください。一致したら、適切なグループ番号 (1 または 3) にアクセスして、一致した通貨を取得できます。例えば:

    curren = m.group(1)
    amount = m.group(2)

「通貨」正規表現全体が単一のグループとして扱われるため、これが可能になります。

入力にお金の表現の無限のパターンがない限り (おそらく不可能です)、問題は適切な正規表現で確実に解決できます。

于 2013-03-03T09:17:08.180 に答える
0

正規表現を使用して、可能なペアを大まかに抽出します。

import re

test = '''Lorem ipsum dolor sit amet, 100.000,00 USD sadipscing elitr, sed diam nonumy eirmod 
GBP 400 ut labore et dolore magna aliquyam erat, sed diam voluptua. At USD 20 eos et 
accusam et justo duo dolores et 100,000.00 USD  ea rebum. Stet 3,-- USD gubergren, no'''

number = r'([\d+.,]+)'
currency = r'([A-Z]{2,3})'

r1 = re.compile(number + r'\s+' + currency)
r2 = re.compile(currency + r'\s+' + number)

matches = r1.findall(test) + r2.findall(test)

print(matches)

私は得る:

[('100.000,00', 'USD'), ('100,000.00', 'USD'), ('GBP', '400'), ('USD', '20')]

そこから、数値を解析し、存在しない通貨を除外できます。可能な形式は5つまたは6つしかないため、ここでは機械学習でできることは何もありません。

于 2013-03-03T09:57:31.097 に答える