我有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)
它是免费的,并且具有宽松的许可证!