主题模型(1):LSI模型
一、LSI是什么?
在某些情况下,有些关键词并不会显式的出现在文档之中,如:讲动物生存环境的科普文章,通常会介绍狮子老虎等等各种动物的情况,但是在文章中并不会显式的出现动物二字,故在这一种情况下,就需要主题模型。
LSI(Latent Semantic Indexing),也就是潜在语义索引,有时候也叫LSA(Latent Semantic Analysis),也就是潜在语义分析,LSI是基于SVD(奇异值分解)来得到文章的潜在主题的关键词的。
1.SVD
定义:将一个非零的 m ∗ n m*n m∗n的实矩阵 A A A,表示为以下三个实矩阵乘积形式的运算: A = U Σ A = U\Sigma A=UΣ V T V^T VT,其中, A A A为 m ∗ n m*n m∗n的实矩阵, U U U为 m m m阶正交矩阵, Σ \Sigma Σ是由降序排列的非负的对角线元素组成的 m ∗ n m*n m∗n的矩形对角矩阵,也就是特征值的平方根, V V V为 n n n阶正交矩阵。在自然语言处理中, A A A i j ij ij可以表示为第 i i i个文本中第 j j j个词的特征值, U U U i l il il表示第 i i i个词和 l l l个词义之间的关联, Σ \Sigma Σ l m lm lm表示第 l l l个词义和 m m m个主题之间的关系, V V V j m jm jm表示第 j j j个文本和第 m m m个主题之间的关系,一般主题数比文本数要少。
1.1 如何求矩阵的奇异值分解
先进行
V
V
V的求解:
&emsp**;**用相同的方法可以求出
U
U
U,所以可以得出一个结论,
A
T
A
A^TA
ATA的特征向量为
V
V
V,
A
A
T
AA^T
AAT的特征向量为
U
U
U,任意给定一个实矩阵,其奇异值分解一定存在,但是不是唯一的。
1.2 实例进行证明
二、代码
# 加载停用词
def stopword():
stop_word_path = r'D:\ProgrammingSoftware\pycharm\HanLp\stopword.txt'
stopword_list = [sw.replace('\n', '') for sw in open(stop_word_path,encoding='utf-8').readlines()]
return stopword_list
# 去掉干扰词
def word_filter(seg_list):
stopword_list = stopword()
filter_list = []
for seg in seg_list:
word = seg.word
flag = seg.flag
if not flag.startswith('n'):
continue
if not word in stopword_list and len(word) > 1:
filter_list.append(word)
return filter_list
if __name__ == '__main__':
text = '6月19日,《2012年度“中国爱心城市”公益活动新闻发布会》在京举行。' + \
'中华社会救助基金会理事长许嘉璐到会讲话。基金会高级顾问朱发忠,全国老龄' + \
'办副主任朱勇,民政部社会救助司助理巡视员周萍,中华社会救助基金会副理事长耿志远,' + \
'重庆市民政局巡视员谭明政。晋江市人大常委会主任陈健倩,以及10余个省、市、自治区民政局' + \
'领导及四十多家媒体参加了发布会。中华社会救助基金会秘书长时正新介绍本年度“中国爱心城' + \
'市”公益活动将以“爱心城市宣传、孤老关爱救助项目及第二届中国爱心城市大会”为主要内容,重庆市' + \
'、呼和浩特市、长沙市、太原市、蚌埠市、南昌市、汕头市、沧州市、晋江市及遵化市将会积极参加' + \
'这一公益活动。中国雅虎副总编张银生和凤凰网城市频道总监赵耀分别以各自媒体优势介绍了活动' + \
'的宣传方案。会上,中华社会救助基金会与“第二届中国爱心城市大会”承办方晋江市签约,许嘉璐理' + \
'事长接受晋江市参与“百万孤老关爱行动”向国家重点扶贫地区捐赠的价值400万元的款物。晋江市人大' + \
'常委会主任陈健倩介绍了大会的筹备情况。'
def topic_extract(word_list, model, pos=False, keyword_num=10):
doc_list = load_data(pos)
topic_model = TopicModel(doc_list, keyword_num, model=model)
topic_model.get_simword(word_list)
print('LSI模型结果:')
topic_extract(filter_list, 'LSI', pos)
三:参考资料
《Python自然语言处理实战核心技术与算法》
《统计学习方法》