Python - 匹配和解析包含数字/货币金额的字符串

mrt*_*mrt 4 python regex parsing currency text-mining

假设我在 python 中有以下字符串(输入):

1) "$ 1,350,000" 2) "1.35 MM $" 3) "$ 1.35 M" 4) 1350000(现在是数值)

显然,尽管字符串表示形式不同,但数字是相同的。如何实现字符串匹配,或者换句话说,将它们分类为相等的字符串?

一种方法是使用正则表达式对可能的模式进行建模。不过,可能有一种情况是我没有想到的。

有人看到这个问题的 NLP 解决方案吗?

谢谢

smc*_*mci 5

这不是一个 NLP 问题,只是正则表达式的工作,加上一些忽略顺序的代码,并查找已知缩写(/本体)的字典,如“MM”。

\n\n
    \n
  • 首先,您可以完全忽略此处的“$”字符(除非您需要消除与其他货币或符号的歧义)。
  • \n
  • 所以这一切都归结为解析数字格式,并映射 \'M\'/\'MM\'/\'million\' -> 1e6 乘数。并以与顺序无关的方式进行解析(例如,乘数、货币符号和金额可以以任何相对顺序出现,或根本不出现)
  • \n
\n\n

这是一些工作代码:

\n\n
def parse_numeric_string(s):\n\n    if isinstance(s, int): s = str(s)\n\n    amount = None\n    currency = \'\'\n    multiplier = 1.0\n\n    for token in s.split(\' \'):\n\n        token = token.lower()\n\n        if token in [\'$\',\'\xe2\x82\xac\',\'\xc2\xa3\',\'\xc2\xa5\']:\n            currency = token\n\n        # Extract multipliers from their string names/abbrevs\n        if token in [\'million\',\'m\',\'mm\']:\n            multiplier = 1e6\n        # ... or you could use a dict:\n        # multiplier = {\'million\': 1e6, \'m\': 1e6...}.get(token, 1.0)\n\n        # Assume anything else is some string format of number/int/float/scientific\n        try:\n            token = token.replace(\',\', \'\')\n            amount = float(token)\n        except:\n            pass # Process your parse failures...\n\n    # Return a tuple, or whatever you prefer\n    return (currency, amount * multiplier)\n\nparse_numeric_string("$ 1,350,000")\nparse_numeric_string("1.35 MM $")\nparse_numeric_string("$ 1.35 M")\nparse_numeric_string(1350000)\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 对于国际化,您可能需要注意,,and.作为千位分隔符和小数点可以切换,或者\'作为(阿拉伯语)千位分隔符。还有一个第三方Python包“parse”,例如parse.parse(\'{fn}\', \'1,350,000\')(它是相反的format()
  • \n
  • 使用本体或通用 NLP 库可能会带来更多麻烦,而不是其价值。例如,您需要消除“百万会计缩写”中的“mm”与“毫米”与“兆米,10^6 米”中的“毫米”之间的歧义,这几乎是-从未使用过但有效的距离公制单位。因此,对于这项任务来说,较少的通用性可能更好。
  • \n
  • 您还可以使用基于字典的方法来映射其他货币符号,例如“美元”、“美国”、“美元”、“美元”、“欧盟”...
  • \n
  • 在这里我对空格进行标记,但您可能想对任何单词/数字/空格/标点符号边界进行标记,以便您可以解析例如USD1.3m
  • \n
\n