问题描述
我有两个句子:
sent1="This work has been completed by Christopher Pan".
sent2="This job has been finished by Mark Spencer".
我使用Word2vec计算了句子的相似度:
from sklearn.metrics.pairwise import cosine_similarity
def avg_sentence_vector(words,model,num_features,index2word_set):
featureVec = np.zeros((num_features,),dtype="float32")
nwords = 0
for word in words:
if word in index2word_set:
nwords = nwords+1
featureVec = np.add(featureVec,model[word])
if nwords>0:
featureVec = np.divide(featureVec,nwords)
return featureVec
如下:
sent1_avg_vector = avg_sentence_vector(sent1.split(),model=word2vec_model,num_features=100)
sent2_avg_vector = avg_sentence_vector(sent2.split(),num_features=100)
sen1_sen2_similarity = cosine_similarity(sent1_avg_vector,sent2_avg_vector)
我想知道如何构建一个可以告诉我的语义树:
-
completed
和finished
是相似的词; -
work
和job
也是相似的词; - 然后,如果我在句子或
work/job
中找到finished/completed
,则这些词都与Christopher
和Mark
相关。
从技术上我不知道Python中是否有什么可以让我得到这样的结果。如果您能引导我朝正确的方向前进,我将不胜感激。
谢谢
解决方法
在文本中使用单词的所有单词向量的平均值是一种用于创建全文摘要向量的快速简便的技术-但不会捕获所有含义的阴影,尤其是语法构造所创建的阴影,单词修饰词或多词短语。
您的word2vec模型可能已经使'completed'
和'finished'
的向量相似,从而反映出'work'
和'job'
的含义相似,或者Christopher
和Mark
的事实。只需直接比较这些词向量,然后将结果与其他词向量的比较进行对比,就会告诉您相对相似或相似的词对或词组。
“这两个词都与'Christopher'
或'Mark'
相关”的含义不明确。一组通用的单词向量可能没有针对'Christopher'
或'Christopher Pan'
的非常有意义的向量,因为它们是仅具有局部含义的专有名称来表示特定的人,而与较大的概念没有强大的联系。 (由于许多word2vec训练会在训练之前设置大小写变平的词,因此对于'Mark Spencer'
甚至根本没有大写的向量)。
要想知道推荐的内容,您需要多说些什么意思。例如,您可能需要一个用于“命名实体识别”(NER)的工具,以识别class MyController extends Controller
{
public function index(Request $request)
{
if ($request->popular) {
//....
}
//...
}
和$request→popular
是感兴趣的离散实体,以及其他可识别语法的语法或语法的一部分。 -语音标记,将其标记为与其他动词/动作相关的实体。
您可以做的是在单词之间创建相似度矩阵
word1 word2 word3 word4
word1 0 1.1 2.2 3.3
word2 1.1 0 2.2 3.3
word3 1.1 2.2 0 3.3
word4 1.1 2.2 3.3 0
仅用于演示的数字
这可以通过两个for循环来完成
for w1 in words:
for w2 in words:
matrix.append(similarety(w1,w2))
然后对矩阵的每个列表进行迭代以使用
检索最大值索引 matrix[0].index(max(matrix[0]))
例如,单词1将返回3.3的最大索引3,因此,单词1与单词4最相似