[文本语义相似] 基于bow的余弦距离(sklearn实现)

 

文本相似在问答系统中有很重要的应用,如基于知识的问答系统(Knowledge-based QA),基于文档的问答系统(Documen-based QA),以及基于FAQ的问答系统(Community-QA)等。像 对于问题的内容,需要进行相似度匹配,从而选择出与问题最接近,同时最合理的答案。本节介绍 基于bow的余弦距离计算相似度。

 

基于sklearn的方式如下:

import os
import jieba
import pickle
import logging
import numpy as np
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer 


class StopWords(object):
    '''
    '''
    def __init__(self, stopwords_file=stopwords_file ):
        self.stopwords = set( [ word.strip() for word in open(stopwords_file, 'r') ] )
    
    def del_stopwords(self, words):
        return [ word for word in words if word not in self.stopwords ]

stop_word = StopWords()

# 是否分词、  及其停用词语
def _seg_word(words_list, jieba_flag=True, del_stopword=False):
    if jieba_flag:
        word_list = [[stop_word.del_stopwords(words) if del_stopword else word for word in jieba.cut(words)] for words in words_list]
    else:
        word_list = [[stop_word.del_stopwords(words) if del_stopword else word for word in words] for words in words_list]
    return [ ' '.join(word) for word in word_list  ]


# 不实用自带停用词
vectorizer = CountVectorizer(stop_words = None, token_pattern='(?u)\\b\\w\\w*\\b') 

word_list = ['我爱北京天安门', '你好,在干嘛呢', '这个什么价钱']
word_list = _seg_word(word_list)
vectorizer.fit_transform(word_list)

# 保存模型
dic_path = './bow.model'
with open(dic_path, 'wb') as f:
    pickle.dump(vectorizer, f)

# 加载模型
with open(dic_path, 'rb') as f:
    vectorizer = pickle.load(f)


def _normalize(x):
   x /= (np.array(x)**2).sum(axis=1, keepdims=True)**0.5 
   return x

# 得到句子向量
word1 = ['你好,在干嘛呢']
bow_embedding1 = vectorizer.transform(_seg_word([word1]))
bow_embedding1 = bow_embedding1.toarray().sum(axis=0)
bow_embedding1  = bow_embedding1[np.newaxis, :].astype(float)
bow_embedding1 = _normalize(bow_embedding1)
word2 = ['这个什么价钱']
bow_embedding2 = vectorizer.transform(_seg_word([word2]))
bow_embedding2 = bow_embedding2.toarray().sum(axis=0)
bow_embedding2  = bow_embedding2[np.newaxis, :].astype(float)
bow_embedding2 = _normalize(bow_embedding2)


# 获取两个句子相似度得分
score = np.dot( bow_embedding1[0], bow_embedding2[0] ) 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MachineLP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值