我有 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)。
Word2Vec 是一种在向量空间中表示标记语义的方法,它可以比较单词的含义,而不需要像 WordNet 这样的大型词典/同义词库。
Word2Vec 常规实现的一个问题是它确实区分同一单词的不同含义。例如,单词 bank 在所有这些句子中将具有相同的 Word2Vec 表示形式:
- 河岸干涸了。
- 银行借钱给我。
- 飞机可能向左倾斜。
银行在每种情况下都有相同的向量,但您可能希望将它们分类到不同的组中。
解决此问题的一种方法是使用 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)
它是免费的并且拥有自由许可证!
关于python-3.x - 将具有相同含义的单词分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42698919/