我有成千上万行的文本,我需要在那里找到货币表示法,例如:
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脚本应该返回转换为USD的金额。(例如,100000USF、400英镑->美元等)
到目前为止,我所做的是手动创建数字-货币组合的正则表达式来检索值,然后将货币与数据库进行比较并计算汇率。
然而,这既不是有效的,也不是未来的证据(例如,如果添加了另一种货币),所以我想知道是否有一种有效的机器学习算法,我可以用一些例子来“训练”,然后它试图找到一些“价值-货币”的组合?
发布于 2013-03-03 09:17:08
您的问题没有很好地定义,但不需要机器学习。可能的货币集合是有限的并且很小,并且货币表示的集合不能复杂到不能作为正则表达式来表达。您根本没有使用正则表达式的全部功能。
例如,要匹配多个货币,请使用:
currency = r"((USD)|(GBP)(...))"
然后,您可以表达表示的数字部分
numbers = r"([0-9]+[0-9\.,]*)"
编译正则表达式:
matcher = re.compile(numbers+r"[\s]*+"currency)
您可以创建第二个匹配器,该匹配器首先匹配货币。你也许可以在可选的捕获组之类的地方使用一些聪明的东西,但是如果性能不是一个大问题,我会推荐一个简单的第二个匹配器。
matcher2 = re.compile(currency+r"[\s]*"+numbers)
请注意,“currency”正则表达式不需要手动创建。一旦有匹配,您就可以访问相应的组号(1或3)来获取匹配的货币。例如:
curren = m.group(1)
amount = m.group(2)
这是可能的,因为整个“货币”正则表达式被视为一个单独的组。
发布于 2013-03-03 09:40:03
人类甚至可以学习缩写词是否是一种货币?如果一种新的货币突然出现,那么它与任何其他任意的缩写词有什么区别?假设你遇到了像“1000CPU”这样的东西,如果你不知道CPU是什么,你怎么知道它是(或不是)货币?
您可以使用自然语言处理来查看有问题的数字周围的上下文,但这将需要更多的处理,并且您永远无法确定。
我的观点是:对于这个问题,如果机器学习是适用的,那就有点过头了。
为什么要用困难的方式做一些事情,而用另一种方法做起来更容易、更准确?
发布于 2013-03-03 09:57:31
我只会使用正则表达式来粗略地提取可能的对:
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')]
从那里,您可以解析数字并过滤掉不存在的货币。你只有五六种可能的格式,所以在这里机器学习真的无能为力。
https://stackoverflow.com/questions/15183685
复制