当前位置: 移动技术网 > IT编程>脚本编程>Python > 潜在语义分析LSA原理和代码

潜在语义分析LSA原理和代码

2020年07月16日  | 移动技术网IT编程  | 我要评论

潜在语义分析LSA原理及代码

作用

在这里插入图片描述

原理

在我们的数据中有k个主题(想要找到的k个,作为参数进行自定义),每个主题有自己相关的文档m篇,也可以认为是m个句子,然后分出来n个词

比如:
主题一:猫和老鼠
文章(语句)一:我好喜欢看猫和老鼠呀
文章(语句)二:猫和老鼠是米高梅电影公司于1939年制作的一部动画
文章(语句)三:汤姆总是不断努力的去捉同居一室的老鼠杰利,并不断地努力驱赶着这位讨厌的房客。尽管总是失败,但汤姆在追逐中得到的乐趣远远超过了捉住杰瑞
主题二:陈奕迅的演唱会
文章(语句)一:陈奕迅唱歌好好听呀
文章(语句)二:陈奕迅的演唱会好多人呀
文章(语句)三:陈奕迅的演唱会门票好难抢啊

这些语句经过分词后会变成:我、好喜欢、猫和老鼠、电影公司、汤姆、陈奕迅、演唱会(暂时只列出这几个用来演示,实际上会有很多词)

然后进行奇异值分解,A(上面的词汇-语义矩阵)=XTY
在这里插入图片描述
分解之后找出k个最大的奇异值,进行截断(正常情况下数据量非常大,奇异值会很多,这里按照自己的想法找出k个主题),这里面要注意的是奇异值分解后的T矩阵是个对角线矩阵,而且对角线上的值是从大到小进行排列的,如下图
在这里插入图片描述

然后我们保留最大的k个奇异值和其对应的奇异向量,从原本的X和Y矩阵中进行截取,然后进行还原A,也就是重新将截取后的矩阵进行相乘,通过数值就可以判断出主题

参考文章

参考文章链接:
https://www.cnblogs.com/kemaswill/archive/2013/04/17/3022100.html

https://www.weixiuzhan.cn/news/show-13240.html
https://blog.csdn.net/pipisorry/article/details

/42560331?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase

https://www.jianshu.com/p/9fe0a7004560

代码

下面展示一些 内联代码片

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import re
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD

import re # 正则表达式库
import jieba   #分词
import collections # 词频统计库
import numpy as np
import pandas as pd
import networkx as nx  #复杂网络分析库
import matplotlib.pyplot as plt




with open(r'E:\vscode-projects\neg_comment.txt','r',encoding='utf-8') as fp:
    data = fp.readlines()
    data = [x.replace('\n','') for x in data]




# # 进行结巴分词,并进行存储
# for i in range(len(data)):
#     # print(data[i])
#     seg = jieba.cut(data[i],cut_all=False)
#     data[i] = ('/'.join(seg))
#     data[i] = data[i].replace('/',' ')
#     # print(data[i])


# print(data[0])



# # 去除停用词
with open(r'E:\vscode-projects\stoplist.txt','r',encoding='utf-8') as fp:
    stoplist = fp.readlines()
    stoplist = [x.replace('\n','') for x in stoplist]
# print(stoplist)


for i in range(len(data)):
    data_depart = jieba.cut(data[i].strip())
    outstr = ''
    for word in data_depart:
        if word not in stoplist:
            if word != '\t':
                outstr += word
                outstr += ' '
    data[i] = outstr

# print(data[0])
        



# # 利用生成的模型进行奇异值分解,确定主题个数,并进行文件的存储
vectorizer = TfidfVectorizer(max_features =1000, max_df = 0.5,smooth_idf = True)
X = vectorizer.fit_transform(data)
# print(X.shape)  # 生成矩阵的形状

svd_model = TruncatedSVD(n_components=5, algorithm='randomized', n_iter=100, random_state=122)
svd_model.fit(X)
print(len(svd_model.components_))

terms = vectorizer.get_feature_names()
 
for i, comp in enumerate(svd_model.components_):
    terms_comp = zip(terms, comp)
    sorted_terms = sorted(terms_comp, key=lambda x:x[1], reverse=True)[:7]
    print("Topic "+str(i)+": ")
    for t in sorted_terms:
        print(t[0],end=' ')
        with open(r'E:\vscode-projects\theme.txt','a',encoding='utf-8') as fp:
            fp.write(t[0] + ' ')
    print(" ")
    with open(r'E:\vscode-projects\theme.txt','a',encoding='utf-8') as fp:
        fp.write('\n')
    

本文地址:https://blog.csdn.net/ugnbucbjj/article/details/107354708

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网