我正在尝试将大量单词分为5类。每个类的类和字符串示例包括:
invoice-Number : "inv123","in12","123"
invoice-Date : "22/09/1994","22-Mon-16"
vendor-Name : "samplevendorname"
email : "abc@gmail.com"
net-amount : "1234.56"
非常感谢任何在python中实现此目的的指针。
编辑1:我正在寻找机器学习方法,因为类的数量会更多,每个类中的数据会有所不同,所以正则表达式是不可行的。
答案 0 :(得分:2)
当您询问指针时,请阅读regular expressions。它们允许您检查字符串是否与特定模式匹配。
Python通过re模块内置了对RegEx的支持。请参阅re.match
功能。
不幸的是,我自己是RegEx的初学者,所以我无法帮助你。但我已经为您提供了上面所需的链接。希望这足以解决您的问题。
与此同时,我会请朋友回答这个问题。
编辑:
我在RegEx中挖了一分钟,这就是我想出来的:
import re
s = <Whatever you are trying to match>
invoice_number = '(inv|in)\d+'
invoice_date = '((\d{2}/\d{2}/\d{4})|(\d{2}-[A-Z][a-z]{2}-\d{2}))'
vendor_name = '[a-z]+'
email = '\w+@\w(\.\w+)+'
net_amount = '\d+\.\d{2}'
if re.match(invoice_number, s):
# classify as invoice-number
elif re.match(invoice_date, s):
# classify as invoice-date
elif re.match(vendor_name, s):
# classify as vendor-name
elif re.match(email, s):
# classify as email
elif re.match(net_amount, s):
# classify as net-amount
else:
# OOPS!!!
答案 1 :(得分:0)
你可以从BoW (Bag of Word)的基础想法开始,但是使用一个不会删除任何字符并为n-grams构建一个字典的标记器修改为BoC(字符的Bac)到4个字符。
之后,您可以将任何单词表示为向量,可以对抗存在的数量,是否存在或tfidf。
然后构建你的模型并将单词vector传递给它以供学习。您可以研究n-gram的交叉标签,以丢弃在数据集中产生噪声的那些。
我希望这有助于一个起点。
答案 2 :(得分:0)
尝试找出不同类别之间的差异。例如,我可以看到发票号码往往混合了字母和数字,日期可能包含一个/或 - ,电子邮件必须有一个@,最后净额将完全由数字组成。如果您可以使用这些属性,我相信您可以轻松地对它们进行分类。
另外,如果它更难,你可以尝试使用NLTK,但我不知道这个例子的效果如何。