哪些机器(或深度)学习方法可以适合我的文本分类问题?

数据挖掘 机器学习 分类 深度学习 nlp 逻辑回归
2021-09-18 04:13:24

我是一名长期工程师,机器学习经验几乎为零,他正试图确定一个好的起点来解决我的问题(希望使用机器学习)。

问题(我会保持简单):

  • 最终,我希望能够自动为金融交易描述分配一个类别
  • 例如:“121217 POST XX123 TONYS COFFEE”,金额为 5 美元,应映射到“Food & Drink”
  • 交易描述是非结构化的,通常由非自然语言组成;有时单词可以被截断,或连接到其他单词
  • 描述中可能有也可能没有“特征”,例如国家/地区代码、日期等
  • 总体而言,无法保证描述中标记的顺序或结构
  • 一笔交易总会有一个金额

假设:

  • 我维护了一个潜在类别列表(可能总共 20 或 30 个)
  • 我可以维护一个庞大的企业名称列表,映射到他们独特的类别(但可能没有必要使用?)
  • 有一组现有的训练标记数据(原始描述/数量及其所属的类别;以千计,而不是数百万计)

可以考虑尽最大努力从描述中提取企业名称,但如果这对最终系统的准确性来说不是必需的,那就太好了。

我最初是有点想 NLP 的,但由于这是相当非自然的语言,没有语义,我相信没有使用 NLP。NER(命名实体识别)可能也不是很有帮助,因为通常需要对文本有所了解才能确定实体。

我正在考虑下载 GloVes 预训练的词向量 ( https://nlp.stanford.edu/projects/glove/ ),以帮助确定与类别相关的词,尽管我不确定现在如何或如何这可能会奏效。这个想法可能是,如果我训练一些东西说“Jimmy's Diner” -> “Food & Drink”,那么,例如,“Bobby's Rest”也可能映射到“Food & Drink”,因为这是最接近它的类别单词关系/距离的术语。这取决于能够以这种方式查询词嵌入以及对其进行训练的可能性。

我想在其他使用标记数据训练系统时,我需要从描述中提取特征。问题是,有什么特点?某些功能可能无用(唯一标识符、连接词等)。我需要系统在用无用的功能污染它方面有点宽容(在一定程度上可以避免,但可能并非不可避免)。

无论哪种方式,很高兴听到你们中的一些专家如何开始处理这个问题:您认为哪种 ML 技术最合适?

在过去的几天里,我对机器学习和深度学习及相关框架进行了相当多的研究,但是有很多领域,潜力巨大,很难知道从哪里开始。

3个回答

您声明某些单词可能偶尔会被截断或连接。因此,我将从您的字符串中提取n-gram,然后将其用于词袋向量。

这是如何运作的?


n-grams是一种基于语言的数据的特征提取技术。它对字符串进行分段,以便可以找到词根,忽略动词结尾、复数等......

分割工作如下:

字符串:Hello World

2-gram:“He”、“el”、“ll”、“lo”、“o”、“W”、“Wo”、“or”、“rl”、“ld” 3-gram:“Hel” 、“ell”、“llo”、“lo”、“o W”、“Wo”、“Wor”、“orl”、“rld” 4-gram:“Hell”、“ello”、“llo”、“ lo W”、“o Wo”、“Wor”、“Worl”、“orld”

因此,在您的示例中,如果我们使用 4-gram,单词 Hello 的截断看起来是相同的。这种相似性会被你的特征捕捉到。


Bag-of-Words构建了它在训练阶段看到的单词的字典。然后使用示例中每个单词的频率创建一个向量。然后可以将其与任何标准机器学习技术一起使用。


由于会产生大量的克数,您将需要进行一些特征降维。您可以使用 PCA 和 LDA 等技术来确定哪些特征(克)与您的决策边界最相关。

参考@JahKnows 的答案,我认为他可能试图指的是阻止n -grams(我会评论但没有足够的声誉)。使用 python 包 nltk 它应该允许您停止单词,因为您只想获取每个单词的词根。

根据我的研究,n-gram是长度为n的单词序列。它们对于词袋建议仍然非常有帮助。python 库 scikit-learn 有一个CountVectorizer类,可让您创建此模型。此外,它还允许您设置最大数量的功能,可以作为您的功能减少。

此外,如果您要走这条路,我会继续使用Tf-idf来找出单词对文档的“重要性”。您可以在wiki上阅读更多内容Scikit-learn 有一个很好的使用CountVectorizerTf-idf处理文本数据的教程:使用文本数据

最后一步是选择一个多类分类模型并将其输入OneVsRestClassifier(全部在 scikit-learn 中),然后选择哪个效果最好。(作为开始,您可以尝试Naive Bayes、SVM等。)这应该很有效,因为您已经有很多(我假设)标记数据。

祝你好运!

Facebook 的fasttex非常适合松散格式的文本。Fasttext 是一个用于执行多项任务的库,您想要使用的是文本分类。fasttext 最好的部分是使用字符 n-gram,而不是使用完整的单词(@JahKnows 描述得很好)。使用该工具最困难的部分是正确格式化训练数据,但只需查看提供的示例,您应该很快就会得到它。