将具有相同含义的单词分类
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
我有 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