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

Sha*_*amy 2 machine-learning scikit-learn supervised-learning text-classification

我正在使用scikit-learn监督学习方法进行文本分类.我有一个训练数据集,其中包含输入文本字段及其所属的类别.我使用tf-idf,SVM分类器管道来创建模型.该解决方案适用于正常的测试用例.但是如果输入的新文本与训练集中具有synoynmous单词,则解决方案无法正确分类.例如:训练数据中可能出现'run'一词,但如果我使用'sprint'一词进行测试,则该解决方案无法正确分类.

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

ely*_*ase 5

您应该查看单词向量和密集文档嵌入.现在你正在通过scikit-learn一个矩阵X,其中每一行都是数据集中文档的数字表示.您正在使用tf-idf获得此表示,但正如您所注意到的那样,这不会捕获单词的相似性,并且您也会遇到词汇单词的问题.

可能的改进是用具有相似含义的单词的密集向量表示每个单词,使得在该300维空间中接近.幸运的是,您不需要从头开始构建这些向量(查找gensim word2vec和spacy).另一个好处是,通过使用在维基百科等非常大的语料库中预先训练的单词嵌入,您将大量有关世界的语言信息合并到您的算法中,否则您无法从语料库中推断出(就像冲刺和运行的事实一样)是同义词).

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

让你开始的示例伪代码:

>>> 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, ...
Run Code Online (Sandbox Code Playgroud)

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

注意即使单词不同,向量如何相似(在余弦相似性的意义上).因为向量是相似的,所以scikit-learn分类器将学习将它们分配到相同的类别.使用tf-idf表示不会出现这种情况.

这是你如何在scikit-learn中使用这些向量:

X = [nlp(text).vector for text in corpus]
clf.fit(X, y)
Run Code Online (Sandbox Code Playgroud)