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 等)

到目前为止,我所做的是手动为数字 - 货币组合创建正则表达式以检索值,然后将货币与数据库进行比较并计算兑换。

然而,这既不是有效的,也不是未来的证明(例如,如果添加了另一种货币)所以我想知道是否有一种有效的机器学习算法,我可以用一些例子“训练”,然后它试图找到 sich “价值 - 货币“组合?

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)

您可以先创建第二个匹配货币的匹配器。您可能可以对可选的捕获组等使用一些聪明的东西,但如果性能不是一个大问题,我会推荐一个简单的第二个匹配器。

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

请注意,不需要手动创建“货币”正则表达式。匹配后,您可以访问相应的组号(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')]

从那里,您可以解析数字并过滤掉不存在的货币。你只有五六种可能的格式,所以机器学习在这里真的无能为力。

于 2013-03-03T09:57:31.097 回答