将具有相同含义的单词分类

Classify words with the same meaning

我有 50.000 封电子邮件的主题行,我想根据同义词或可以代替其他人使用的词对其中的词进行分类。

例如:

销量最高!

最佳销量

我希望他们在同一组。

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

def synonyms(w,group,guide):
    try:
         # Check if the words is similar
        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 来解决这个问题,结果将是从单词到向量的映射,当它们具有相似的含义时,它们是 "near",例如 "car" 和 [=14] =] 将接近而 "car" 和 "food" 不会,然后您可以测量 2 个单词之间的矢量距离并定义一个阈值到 select 如果它们非常接近以至于它们意味着相同,正如我所说,它只是 word2vec

的一个想法

完成此操作的最简单方法是比较各个词嵌入的相似性(最常见的实现是 Word2Vec)。

Word2Vec 是一种在向量 space 中表示标记语义的方法,它可以比较单词的含义,而不需要像 WordNet 这样的大型 dictionary/thesaurus。

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

  • 河流河岸干涸了。
  • 银行借钱给我
  • 飞机可能向左倾斜

Bank 在每种情况下都有相同的向量,但您可能希望将它们分类到不同的组中。

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

Python 中的一个很棒的库是 Spacy. It is like NLTK, but much faster,因为它是用 Cython 编写的(标记化速度快 20 倍,标记速度快 400 倍)。它还内置了 Sense2Vec 嵌入,因此您无需其他库即可完成相似性任务。

就这么简单:

import spacy

nlp = spacy.load('en') 

apples, and_, oranges = nlp(u'apples and oranges')
apples.similarity(oranges)

它是免费的,并且有自由许可!

Nick所说的计算是计算两个短语向量之间的距离(余弦距离)。

Top sales!
Best sales

这是一种方法:How to calculate phrase similarity between phrases