我有几份公司发票的文本文件,这些文件中包含不同种类的日期格式
dd/mm/yyyy
mm:dd:yy
dd,monthname,yy
yearname,monthname,dd
等等。这里无法列出所有独特的模式。
问题是我一直在使用正则表达式和(主要是)if-else字符串匹配来查找这些日期,但我确信有更好的方法来识别它们,而不是硬编码程序来查找不同的模式
我还想提取其他特征,比如‘总计’金额,它也有不同的格式,如
Total$123
Total $123
$123Total
$123 Total
这里是一些示例文本文件
Demo Company INVOICEDemo Company Phone : 141-222-3333 Invoice# 10241234 Main Street Fax: 222-3984444 Account# C1000Ashland, KY 41102 Email : [email protected] Date 01-08-2009Due By 02-05-2009‘Subtotal $212.44Tax $1.25Total $213.69Balance Due $213.69
SAMPLE PURCHASE ORDERToNGEPurchase Order Number 2FROM: Purchase Order Date 6:15:2Your Company1122 Cherry LaneSan Diego, CA 921761 | MH1000 | MATHOIST STORAGE SYSTEMFOR (@)45°x $8920.00 | $8,920.00MATS (see product description)1 [NA Mat Hoist Voltage??? 208V, 230V or 460V Nec Nec6 |cL7 CL-7 UNIT CLAMPSA8.75 $292.50
123 Anywhere St.Some City, CA 91000Phone (555) 555-1212 Fax (555) 555-5555P.O. NUMBER: 1234P.O. DATE: 4/15/13SUBTOTAL $3000SALES TAX $s 240TOTAL $3240
这是我用于提取日期和总金额的代码
def extractdate(): with open(inpf, "r") as ifile: for line in ifile: if line.startswith("DATE"): print(next(ifile, '').strip()) elif line.startswith("P.O. DATE"): if "P.O. DATE" in line: # print(line) print('') elif str("Date") in line: # print(line) print('') elif str("date")in line: # print(line) print('')
def totalamount(): with open(inpf, "r") as ifile: for line in ifile: if 'TOTAL' in line or 'Total' in line: s = "" for i in range(len(line)): if line[i].isdigit(): s += line[i] elif not line[i].isdigit() and line[i-1].isdigit(): break
有什么方法可以使用机器学习训练模型来提取这些特征吗?
回答:
这还不是一个需要自然语言处理的问题。你需要找的有两类数据:日期和总金额。有很多关于查找和解析各种日期时间格式的参考资料;你需要根据你想使用的解析形式来研究这些。通常使用正则表达式或内置的解析包是最简单的。
另一个很简单:你要找的是带有“total”字样和“$”符号的行。当这两者都在行中存在时,只需抓取“$”旁边的十进制金额即可。
鉴于这两个问题都有已知的解决方案,使用机器学习有点过火了。