【python 走进NLP】文本语义相似度合并算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013421629/article/details/82501028

这里写图片描述

算法融合:

  • 1、基于word2vec的词语相似度计算模型
  • 2、标签别名语义相似度匹配算法

本算法是两种算法融合产生的效果,效果还不错:

# -*- encoding=utf-8 -*-

# 载包
from gensim.models import Word2Vec
import warnings
warnings.filterwarnings("ignore")
warnings.filterwarnings(action='ignore',category=UserWarning,module='gensim')
from itertools import combinations
import pandas as pd
import time
time1=time.time()


# 加载word2vec训练好的模型

model = Word2Vec.load("F:/下载/content/word_embedding_20180907")

# 加载别名数据集

data0 = pd.read_excel('C:/Users/xiaohu/Desktop/文本挖掘/标签语义相近发现合并算法/data/kktribe_tag_1.xlsx')




# 自定义获取近义词函数
def get_most_similar_list(string1):
    # 使用模型
    try:
        items = model.most_similar(string1)
        key=[]
        value=[]
        for i, j in items:
            # print(i, j)
            key.append(i)
            value.append(j)
        result=pd.DataFrame({"key":key,"value":value})
        print(result)

    except:
        print('找不到该单词的近义词!')
        pass

    return result



#定义一个标签有别名的合并函数

def combine_tag_name_alis(data1,data2):
    """
    :param data1: 别名集
    :param data2:标签集
    :return: 合并后的结果集
    """
    # 筛选数据,找到有别名的标签
    data3 = data1[data1['alias'].isin(data2['key'])]
    data4=data2[~data2['key'].isin(data3['alias'])]

    #语义相似标签去重
    name1= list(set(data3['name']))
    name2=list(set(data4['key']))
    name3=name1+name2
    name4=list(set(name3))
    return name4



# 自定义标签去重函数

def get_similarity(data2):

    data3 = set(data2['key'])
    tag_drop_list = []
    # 计算两个词语相似度
    for i, j in combinations(data3, 2):
        try:
            similary = model.similarity(i, j)
            # print(i, j, similary)
            # 如果两个词语相似度>0.6,则合并为一个词语
            if similary >0.75:

                print(i,j,similary)
                if len(i) < len(j):
                    tag_drop_list.append(i)
                if len(i) > len(j):
                    tag_drop_list.append(j)

                if len(i) == len(j):
                    tag_drop_list.append(i)


            else:
                m1 = set([i, j])
                new_data = pd.DataFrame({'key': [i, j]})
                #  合并之后的标签集
                name = combine_tag_name_alis(data0, new_data)

                # print(name)
                if len(name) == 1:
                    m2 = name
                    m2 = set(m2)
                    m3 = (m1 - m2)
                    m3_1 = m3.pop()
                    tag_drop_list.append(m3_1)


        except:


            m1=set([i,j])
            new_data = pd.DataFrame({'key': [i,j]})
            #  合并之后的标签集
            name = combine_tag_name_alis(data0, new_data)

            # print(name)
            if len(name)==1:
                m2=name
                m2=set(m2)
                m3=(m1-m2)
                m3_1=m3.pop()
                tag_drop_list.append(m3_1)

    # print(tag_drop_list)
    # 集合删除找出的相似词
    data4 =set(tag_drop_list)

    data5 = data3 - data4

    print("最终结果集:")

    # print(data5)

    return data5




if __name__ == '__main__':

    #  读取标签数据集
    data2 = pd.DataFrame({'key': ['詹皇', '小皇帝','辣鸡','垃圾','高倍','高赔','詹姆斯','竞彩足球','C罗','总裁']})

    result=get_similarity(data2)

    print(result)

詹皇 詹姆斯 0.8157515026814683
垃圾 辣鸡 0.9018741525236081
高赔 高倍 0.7765882760905136
最终结果集:
{'辣鸡', '詹姆斯', 'C罗', '高倍', '竞彩足球'}

Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/u013421629/article/details/82501028