对具有相同含义的单词进行分类

dap*_*apo 5 text-processing nlp machine-learning nltk python-3.x

我有来自电子邮件的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
Run Code Online (Sandbox Code Playgroud)

任何想法或工具来实现这一目标?

小智 4

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

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

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

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

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

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

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

很简单:

import spacy

nlp = spacy.load('en') 

apples, and_, oranges = nlp(u'apples and oranges')
apples.similarity(oranges)
Run Code Online (Sandbox Code Playgroud)

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