字符串(不是文档)分类的适当算法?

数据挖掘 机器学习 分类 文本挖掘 多类分类
2021-09-16 11:26:30

我试图将大量的小字符串(数百万)分类为大约 10 个不相干的类别。每个类的类和字符串示例包括:

email: "foo@bar.com"
phone: "55", "22334455"
personName: "John", "Q.", "Public"
organizationName: "Reuters", "IBM"
date: "Dec.", "22.10.2010"
nameAndEmail: "Larsonlarson@gmail.com" (a last name has been concatenated with an email address.)
phoneAndEmail: "55larson@gmail.com" (part of a phone number has been concatenated with an emal address)
separator: ",", "and", "or"
other: stuff that does not fit in other categories.

通过一组启发式进行分类似乎很乏味,所以我一直在尝试使用 SVM。如果不做大量工作,我无法获得超过 80% 的准确率,例如“有一个 & 符号”、“大写”、“大部分是数字”、“中间有一个冒号”等.,这有点违背了目的。

我想知道使用 SVM 的部分挑战是否在于给定字符串的“显着特征”(例如“@”字符)不在字符串中的固定位置,因此它不会获得相同的特征每个字符串的索引。

有没有人有关于更合适的方法来完成这项任务的建议,或者任何人都可以推荐进一步阅读?

3个回答

您可能会发现将 n-gram 字符视为特征空间很有用。然后你可以将一个字符串表示为一袋子字符串。使用N = 4或更大时,您将捕获电子邮件中的“.com”、日期中的“##.#”等内容。

将所有单个数字编码为一个保留的纯数字字符也可能会有所帮助。

一个简单的方法可能是为数据集中的每个字符串创建所有 n-gram 子字符串,然后简单地将单词列表视为文档。然后,您可以在监督步骤中使用词频tf-idf向量。

例如,为“whatever@gmail.com”创建子字符串 uni-、bi- 和 tri-gram:

a = "whatever@gmail.com" 
b = set([a[x:x+y] for y in range(0,4) for x in range(0,len(a))]) 

set(['', 'co', 've', 'ai', 'eve', 'r@', 'at', '.co', 'gm', 'ev', 'tev', 'er', '@gm', 'ver', '@g', 'r@g', 'ail', 'il.', 'gma', '.', 'te', 'hat', '@', 'wha', 'om', 'wh', 'er@', 'mai', 'ma', 'ha', 'l.c', 'a', 'c', 'ate', 'e', 'g', 'i', 'h', '.c', 'm', 'l', 'o', 'l.', 'r', 't', 'w', 'v', 'com', 'il'])

人们可以复制文档的“词袋”模型,尽管它变成了“字符袋”模型。(jamesmf 将此扩展到 n-gram,这将更有用。)

但是如果你想让一个特征对算法很重要,你需要让算法访问那个特征。您无需告诉它该功能与哪些类相关——只需该功能是否存在即可。例如,字符串的长度、字符串中的位数和字符串中的大写字母数量可能对于区分您描述的几个类非常有用,但除非您将它们放入特征向量中,否则它们不会成为特征向量的一部分那里。但是您需要做的就是识别它们,给它们分配编号,然后让 SVM 负责确定它们的相关性。

类似地,在特征向量中有一个二进制变量来判断最后四个字符是否.com(或者是否.com出现在字符串中,如果它不总是在末尾)将传达相同数量的有用信息,而不会给算法带来一堆毫无价值的信息——可能还有其他重要的 4-gram,但在我看来,考虑所有 4-gram 和 3-gram 以获得.com.net.org的已知特征似乎不太值得.

第一次通过为什么不使用正则表达式?
有电子邮件的正则表达式示例
您可以将正则表达式用于@之前有一个数字的电子邮件
(并且您不能断定 55 是电话号码)
从那里您只需要确定它是否有名称
并且您可以使用正则表达式来提取@ 之前的组件

日期的正则表达式

电话号码的正则表达式

我使用正则表达式从文档中提取日期和电子邮件
它与正则表达式一样快速且准确
每个正则表达式都是准确的,它可能无法提取一些边缘情况
您扩展正则表达式或通过算法提取那些

如果您还想对无效电子邮件进行分类,至少您有有效的电子邮件可以比较