Python - 正则表达式 "机器学习
我有成千上万行文本,需要找出里面表示金额的部分,比如:
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英镑 -> 美元,等等。
到目前为止,我的做法是手动创建正则表达式,用来匹配数字和货币的组合,以提取出金额,然后再把货币和数据库里的数据进行比较,计算汇率。
不过,这种方法既不高效,也不够灵活(比如,如果新增了一种货币的话)。所以我在想,是否有一种高效的机器学习算法,我可以用一些例子来“训练”它,然后它就能自动找出这种“金额 - 货币”组合呢?
3 个回答
我会用正则表达式来简单地提取可能的配对:
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')]
接下来,你可以解析这些数字,并过滤掉那些不存在的货币。其实只有五六种可能的格式,所以在这里机器学习并没有什么用处。
人类能不能学会一个缩写是不是货币呢?如果出现了一种新的货币,那它和其他随便的缩写有什么区别呢?比如你看到“1000 CPU”,如果你不知道CPU是什么,怎么判断这是不是货币呢?
你可以用自然语言处理技术来看看这个数字周围的上下文,但这需要更多的处理,而且你永远也不能确定。
我的意思是:对于这个问题,机器学习可能太复杂了,甚至可能不适用。
为什么要用困难的方法呢?其实有更简单、更准确的方法可以做到。
你的问题描述得不太清楚,但其实不需要用机器学习。可能的货币种类是有限且不多的,而货币的表示方式也不会复杂到无法用常规表达式来表示。你只是没有充分利用正则表达式的强大功能。
比如,要匹配多种货币,可以使用:
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)
这是可能的,因为整个'货币'正则表达式会被当作一个单独的组来处理。
除非你的输入中有无限种货币表示方式(这可能不太可能),否则你的问题肯定可以用合适的正则表达式来解决。