解决文本分类的监督学习中的同义词

Posted

技术标签:

【中文标题】解决文本分类的监督学习中的同义词【英文标题】:Addressing synonyms in Supervised Learning for Text Classification 【发布时间】:2017-02-16 00:30:41 【问题描述】:

我正在使用 scikit-learn 监督学习方法进行文本分类。我有一个包含输入文本字段及其所属类别的训练数据集。我使用 tf-idf,SVM 分类器管道来创建模型。该解决方案适用于普通测试用例。但是,如果输入的新文本与训练集中具有同义词,则解决方案无法正确分类。 例如:训练数据中可能存在“运行”一词,但如果我使用“冲刺”一词进行测试,则解决方案无法正确分类。

这里最好的方法是什么?在训练数据集中为所有单词添加所有同义词对我来说似乎不是一种可扩展的方法

【问题讨论】:

您是否尝试使用词袋来尝试捕捉上下文? 【参考方案1】:

您应该研究词向量和密集文档嵌入。现在,您正在向 scikit-learn 传递一个矩阵 X,其中每一行都是数据集中文档的数字表示。您正在使用 tf-idf 获得这种表示,但正如您所注意到的,这并没有捕捉到单词的相似性,而且您还遇到了词汇量不足的问题。

一个可能的改进是用一个维数为 300 的密集向量来表示每个单词,这样具有相似含义的单词在这个 300 维空间中是接近的。幸运的是,您不需要从头开始构建这些向量(查找 gensim word2vec 和 spacy)。另一个好处是,通过使用在 Wikipedia 等非常大的语料库上预训练的词嵌入,您可以将很多关于世界的语言信息整合到您的算法中,否则您无法从语料库中推断出这些信息(例如 sprint 和 run是同义词)。

一旦您获得了单词的良好语义数字表示,您就需要为每个文档获得一个向量表示。最简单的方法是平均句子中每个单词的词向量。

帮助您入门的示例伪代码:

>>> import spacy

>>> nlp = spacy.load('en')
>>> doc1 = nlp('I had a good run')
>>> doc1.vector
array([  6.17495403e-02,   2.07064897e-02,  -1.56451517e-03,
         1.02607915e-02,  -1.30429687e-02,   1.60102192e-02, ...

现在让我们尝试不同的文档:

>>> doc2 = nlp('I had a great sprint')
>>> doc2.vector
array([ 0.02453461, -0.00261007,  0.01455955, -0.01595449, -0.01795897,
   -0.02184369, -0.01654281,  0.01735667,  0.00054854, ...

>>> doc2.similarity(doc1)
0.8820845113100807

请注意向量是如何相似的(在余弦相似度的意义上),即使单词不同。因为向量相似,scikit-learn 分类器将学习将它们分配到同一类别。对于 tf-idf 表示,情况并非如此。

这是在 scikit-learn 中使用这些向量的方法:

X = [nlp(text).vector for text in corpus]
clf.fit(X, y)

【讨论】:

我尝试了您的建议并且能够重现您的结果。但是当我用“我喝了一大杯”进行测试时,它仍然给了我 0.88 的高度相似性。然后我单独测试了“跑步”和“冲刺”之间的相似性,得到了 0.49。您能否建议我是否可以对您的建议进行任何改进以使其表现更好?谢谢 正如您所注意到的,NLP 仍然是一个未解决的问题,它永远不会完美地工作。仍然是词向量是一种改进,因为使用 tf-idf sprint 和 run 之间的相似度将为 0,这甚至更糟。您可以尝试使用 Brown 集群、同义词集来处理同义词,但大多数 SOTA 系统都使用词向量,我的建议是您继续尝试使它们工作。这只是一个开始,还有很多事情可以改进,比如获得更好的 vecs、更好的短语代表等,但我建议你提出一个新问题,因为它包含很多评论信息。 谢谢@elyase 我发布了一个新问题。你能回答一下吗? 平均词向量也是一种粗略的近似,它是利用这种表示的一种方式,但并不理想。在这方面有相当多的研究,如何获得更好的短语表示,甚至是文档表示。 sprintrun 的相似性问题很可能源于您对 sprint 使用相同的向量表示。 i>run 动词和 run 名词(这称为多义词)。 run|VERB 的表示可能是获胜的,因为它出现得更频繁。 run|NOUN 的句法方面会丢失,并且您会得到较低的相似度分数。我建议您首先使用 POS 标签对单词进行注释,并为每个不同的标记构建嵌入,例如 sense2vec。

以上是关于解决文本分类的监督学习中的同义词的主要内容,如果未能解决你的问题,请参考以下文章

基于半监督学习算法的文本分类(自训练)

基于协同训练的半监督文本分类算法

分类与监督学习,朴素贝叶斯分类算法

分类与监督

分类与监督学习,朴素贝叶斯分类算法

分类与监督学习,朴素贝叶斯分类算法