我有来自电子邮件的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
完成此任务的任何想法或工具?
答案 0 :(得分:4)
实现这一目标的最简单方法是比较各个词嵌入的相似性(最常见的实现是Word2Vec)。
Word2Vec是一种表示向量空间中令牌的语义含义的方式,它可以比较单词的含义,而无需像WordNet那样大型字典/词库。
Word2Vec的常规实现的一个问题是它确实区分了同一个单词的不同意义。例如,单词 bank 将在所有这些句子中具有相同的Word2Vec表示:
Bank在每种情况下都有相同的向量,但您可能希望将它们分类到不同的组中。
解决此问题的一种方法是使用Sense2Vec实现。 Sense2Vec模型考虑了令牌的上下文和词性(以及可能的其他特征),允许您区分不同感知词的含义。
Python中的一个很棒的库是Spacy。它就像NLTK,但much faster因为它是用Cython编写的(标记化速度提高了20倍,标记速度提高了400倍)。它还内置了Sense2Vec嵌入,因此您无需其他库即可完成相似性任务。
它很简单:
import spacy
nlp = spacy.load('en')
apples, and_, oranges = nlp(u'apples and oranges')
apples.similarity(oranges)
它是免费的并拥有自由执照!
答案 1 :(得分:1)
一个想法是通过嵌入和word2vec来解决这个问题,结果将是从单词到向量的映射,当它们具有相似的含义时,它们会“接近”,例如“汽车”和“车辆”将靠近并且“汽车” “和”食物“不会,你可以测量2个单词之间的向量距离,并定义一个阈值来选择它们是否如此接近它们意味着相同,正如我所说的只是word2vec的想法
答案 2 :(得分:1)
尼克所说的计算背后的计算是计算两个短语向量之间的距离(余弦距离)。
Top sales!
Best sales