将同义词分类

我有50,000封电子邮件的主题行,我想根据同义词或可以互相替代的词语对其中的词语进行分类。

例如:

Top sales!

Best sales

我想把它们归为一组。

我使用nltk的wordnet构建了以下函数,但效果不佳。

def synonyms(w,group,guide):    try:         # 检查词语是否相似        w1 = wordnet.synset(w +'.'+guide+'.01')        w2 = wordnet.synset(group +'.'+guide+'.01')        if w1.wup_similarity(w2)>=0.7:             return True        elif w1.wup_similarity(w2)<0.7:            return False    except:         return False

有什么想法或工具可以实现这个目标吗?


回答:

实现这个目标最简单的方法是比较各自词嵌入的相似性(最常见的实现是Word2Vec)。

Word2Vec是一种在向量空间中表示词语语义含义的方式,使得可以比较词语的含义,而不需要像WordNet那样的大型词典/同义词词库。

常规的Word2Vec实现的一个问题是它不能区分同一个词的不同含义。例如,单词bank在以下这些句子中会有相同的Word2Vec表示:

  • The river bank was dry.
  • The bank loaned money to me.
  • The plane may bank to the left.

在这些情况下,Bank具有相同的向量,但你可能希望它们被分类到不同的组中。

解决这个问题的一种方法是使用Sense2Vec实现。Sense2Vec模型考虑了词语的上下文和词性(以及可能的其他特征),使你能够区分同一个词的不同含义。

在Python中,一个很棒的库是Spacy。它类似于NLTK,但由于使用Cython编写,速度更快(标记化速度提高20倍,标记速度提高400倍)。它还内置了Sense2Vec嵌入,因此你可以完成相似性任务,而无需其他库。

使用起来非常简单:

import spacynlp = spacy.load('en') apples, and_, oranges = nlp(u'apples and oranges')apples.similarity(oranges)

它是免费的,并且具有宽松的许可证!

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注