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

发布于 2022-09-06 23:38:36 字数 1556 浏览 8 评论 0

我的问题是我现在有三个语句
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)

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

折戟 2022-09-13 23:38:36

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文