【问题标题】:Clustering words on the basis of similarity in meaning which is provided in trainings set根据训练集中提供的含义相似性对单词进行聚类
【发布时间】:2017-02-18 13:43:11
【问题描述】:
哪种机器学习算法可以作为以下问题的起点?
我有一个类似于下面的单词列表。
curate:在某些教会(如圣公会)中协助牧师负责一个教会或一组教会的神职人员
园丁:受雇从事户外工作的人(如修剪草坪)
和其他正常的词。
我想要的是根据它们的含义来决定新词是否属于我们的类别(职位)。
例如:
- 护士:1
- 老师:1
- 游泳:0
- 游泳者:1
- 主持人:1
- 正在播放:0
我正在使用 python 作为实现机器学习目的的工具。
【问题讨论】:
标签:
python
python-3.x
machine-learning
cluster-analysis
word
【解决方案1】:
这是一个文本相似性问题,您希望将给定文本块的相似性与已知集合进行匹配。例如,“护士:从事医疗保健工作的人……”。如果相似度高于某个阈值,则有匹配,否则认为不匹配。
首先,您需要对文本进行某种表示,以便进行比较。一些常见的文本表示是:
使用 TF-IDF,每个职位描述的句子都被转换为一个计数向量,向量的长度等于所有职位描述中所有单词的词汇量。使用 Word2Vec,每个单词都被视为一个定义大小的向量,表示训练语料库中单词的上下文。您可以在数据上交易您自己的 Word2Vec 模型,也可以使用pretrained model。您需要自己组合每个句子的向量,以使职位描述具有可比性。一个简单的第一步是对所有词向量进行平均,但您也可以尝试 Doc2Vec(参见 here)。
最后,您需要一个距离函数来比较两种表示。对于 TF-IDF,cosine similarity 是相当标准的。对于 Word2Vec,你可以使用euclidean distance 甚至是移动器的距离(WMD 见 here 再次)
在高层次上将它们放在一起,您将需要执行以下操作:
trainingWords = {}
trainingWords['gardener'] = 'a person who tends a garden...'
trainingWords['valet'] = 'A person who parks a car...'
trainingVectors = {}
for (category in trainingWords):
trainingVectors[category] = convert(trainingWords[category])
newWord = 'nurse'
newDescription = 'A person working in healthcare...'
newVector = convert(newDescription)
threshold = <some number>
output = {}
for (category in trainingVectors):
if (distance(newVector, trainingVector[category]) < threshold):
output[category] = 1
else:
output[category] = 0
print output
这假设您有一个函数 convert 将原始文本转换为前面提到的重定向之一,一个函数距离,即前面提到的用户距离函数,以及适合您的问题和距离函数的阈值。例如,余弦相似度使用 0 到 1 范围内的值,因此您需要为被视为匹配的值选择一个阈值(例如 0.85)。