python 自然语言处理,遇到了一个问题?

我的问题是我现在有三个语句
case1 = u'处理李村的店铺门前治理'
case2 = u'李村河边巡逻'
case3 = u''我正在李村河边进行河道治理工作' 要将这三个语句中,跟“李村河治理”内容相关的语句对比出来?
请问是使用那些相关技术?望提供相关解决方案

第一种

对要进行比较的str1(输入值 关键词)和str2进行计算,并返回相似度

def simicos(str1, str2):

# str2 分词

word_list = [word for word in jieba.cut(str2)]

all_word_list = [word_list, []]

# str1 分词

word_test_list = [word for word in jieba.cut(str1)]

# 建立词库

dictionary = corpora.Dictionary(all_word_list)

# BOW词袋模型

corpus = [dictionary.doc2bow(word) for word in all_word_list]

word_test_vec = dictionary.doc2bow(word_test_list)

# 建立TFIDF,模型得出该评论集的tf-idf 模型

tfidf = models.TfidfModel(corpus)

# 此处已经计算得出所有评论的tf-idf值

# print(tfidf[corpus])

similar = similarities.SparseMatrixSimilarity(

    tfidf[corpus], num_features=len(dictionary.keys()))

sim = similar[tfidf[word_test_vec]]

# print(sim)

return sim[0]

目前采用的解决方案
第二种方案:
# 对要进行比较的str1和str2进行计算,并返回相似度

def simicos(str1, str2):

cut_str1 = [w for w, t in posseg.lcut(str1) if 'n' in t or 'v' in t]
cut_str2 = [w for w, t in posseg.lcut(str2) if 'n' in t or 'v' in t]
all_words = set(cut_str1 + cut_str2)
freq_str1 = [cut_str1.count(x) for x in all_words]
freq_str2 = [cut_str2.count(x) for x in all_words]
sum_all = sum(map(lambda z, y: z * y, freq_str1, freq_str2))
sqrt_str1 = math.sqrt(sum(x ** 2 for x in freq_str1))
sqrt_str2 = math.sqrt(sum(x ** 2 for x in freq_str2))
return sum_all / (sqrt_str1 * sqrt_str2)

此两种方案均无法实现词义匹配,一个句子(发布的任务,可能文字很长和任务者每天干的事情,怎么更好的匹配起来

阅读 2.5k
1 个回答

基于语义的话就不要光用tf-idf model了,用lsi、lda model试试。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题