如何为单词构建文本分类器?

时间:2018-02-06 12:45:53

标签: python machine-learning nltk text-classification naivebayes

我正在尝试将大量单词分为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:我正在寻找机器学习方法,因为类的数量会更多,每个类中的数据会有所不同,所以正则表达式是不可行的。

3 个答案:

答案 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,但我不知道这个例子的效果如何。