LDA主题模型代码实践

%matplotlib inline

from gensim import corpora, models, similarities
from pprint import pprint
import pandas as pd
import matplotlib.pyplot as plt
import jieba
from string import punctuation

punctuation
## output
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

# 建立停用词表
with open('LDA-data/stop_words.txt','r', encoding='gbk') as f:
    content = f.read()   
stop_list = set(content.splitlines())
stop_list.add(' ') # 单独增加空格符,没办法表示在txt文档中

# 读取数据
df = pd.read_csv('LDA-data/sample_1000.txt', sep='\t')
# 获得所有标签
labels = df['标签'].unique()
labels
## output
array(['组建团队', '危机处理', '市场开拓', '关键交易/谈判', '收购兼并', '承担盈亏', '多业态管理',
       '产品/服务创新', '关停并转', '海外经历', '扭转业绩', '重大项目', '扭转士气', '业务轮岗', '新业务孵化',
       '行业转换', '经历重大组织变革', '职能建设', '推动组织变革', '技术/专业突破'], dtype=object)
       

# 去除停用词(包括标点符号)
df['cutted'] = df['经历'].apply(lambda x: [i for i in list(jieba.cut(x)) if i not in stop_list])
df.head()
## output
经历	标签	cutted
0	帮公司新募全新团队,成功引入一批责任心强,能战斗,懂管理的M1/M2经理队伍,现已成长为华存...	组建团队	[, 公司, 新募, 全新, 团队, 成功, 引入, 一批, 责任心,, 战斗,,...
1	6. 突发事件应对及危机管理	危机处理	[突发事件, 应对, 危机, 管理]
2	4、处理各种突发性事件	危机处理	[处理, 突发性, 事件]
3	负责垂类新客券的设计和开发	市场开拓	[负责, 垂类,, 客券, 设计, 开发]
4	8、做好市场危机公关处理	危机处理	[做好, 市场, 危机, 公关, 处理]


all_docs = {}  # 存放20个文档
for label in labels:
    exps = df[df['标签'] == label]['cutted'].to_list()
    doc = []
    for exp in exps:
        doc = doc + exp  
    all_docs[label] = doc
all_docs
## output    
{'组建团队': ['帮',
  '公司',
  '新募',
  '全新',
  '团队',
  '成功',
  '引入',
  '一批',
  ...


def txts_filter_once(txts):
    """过滤掉只出现一次的token。"""
    freq = defaultdict(int)
    for txt in txts:
        for token in txt:
            freq[token] += 1
            
    result = [[token for token in txt if freq[token] > 1]
           for txt in txts
           ]
    return result

def my_lda(n,m,tfidf=False):
    # 所有文档和标签
    all_txts = [i for i in all_docs.values()]
    all_keys = [i for i in all_docs.keys()]
    # 目前只用前3个文档做测试
    txts = all_txts[n:m]
    # print(txts)
    keys = all_keys[n:m]
    print(keys)
    # 过滤掉只出现一次的单词,但是过滤之后效果不好,所以这里暂时不过滤
    # txts = txts_filter_once(txts) 

    # 根据文档生成词典
    dictionary = corpora.Dictionary(txts)
    # 将文档表示为向量
    corpus = [dictionary.doc2bow(txt) for txt in txts]
    corpus_tfidf = models.TfidfModel(corpus)[corpus]
    length = m-n
    if tfidf:
        # 建立lda模型
        lda = models.LdaModel(corpus_tfidf, num_topics=length, id2word=dic)
        # 打印两个主题,每个主题下的前10个词
        print('每个主题的词分布:')
        pprint(lda.print_topics(num_topics=length, num_words=10))
        print('每个文档的主题分布:')
        for doc_topic in lda[corpus_tfidf]:
            print(doc_topic)
    else:
        # 建立lda模型
        lda = models.LdaModel(corpus, num_topics=length, id2word=dic)
        # 打印两个主题,每个主题下的前10个词
        print('每个主题的词分布:')
        pprint(lda.print_topics(num_topics=length, num_words=10))
        print('每个文档的主题分布:')
        for doc_topic in lda[corpus]:
            print(doc_topic)


my_lda(0,3)
## output
['组建团队', '危机处理', '市场开拓']
每个主题的词分布:
[(0,
  '0.035*"市场" + 0.023*"销售" + 0.022*"渠道" + 0.020*"开拓" + 0.019*"工作" + 0.017*"负责" '
  '+ 0.016*"客户" + 0.016*"新" + 0.015*"开发" + 0.015*"团队"'),
 (1,
  '0.031*"团队" + 0.023*"危机" + 0.018*"销售" + 0.016*"处理" + 0.016*"市场" + 0.015*"公关" '
  '+ 0.014*"建立" + 0.013*"工作" + 0.012*"管理" + 0.010*"业务"'),
 (2,
  '0.032*"处理" + 0.024*"危机" + 0.023*"公关" + 0.020*"市场" + 0.018*"重大" + 0.015*"管理" '
  '+ 0.013*"事件" + 0.012*"开拓" + 0.012*"渠道" + 0.012*"销售"')]
每个文档的主题分布:
[(1, 0.9975111)]
[(2, 0.998401)]
[(0, 0.99839467)]  

my_lda(0,3,tfidf=True)
## output
['组建团队', '危机处理', '市场开拓']
每个主题的词分布:
[(0,
  '0.005*"危机" + 0.005*"处理" + 0.005*"公关" + 0.004*"重大" + 0.003*"团队" + 0.003*"事件" '
  '+ 0.003*"媒体" + 0.003*"风险" + 0.003*"销售" + 0.003*"做好"'),
 (1,
  '0.004*"新" + 0.003*"开拓" + 0.003*"销售" + 0.003*"客户" + 0.003*"描述" + 0.003*"开发" '
  '+ 0.003*"拓展" + 0.003*"维护" + 0.003*"业务" + 0.003*"团队"'),
 (2,
  '0.004*"新" + 0.004*"团队" + 0.003*"销售" + 0.003*"开拓" + 0.003*"描述" + 0.003*"业务" '
  '+ 0.003*"开发" + 0.003*"客户" + 0.003*"落地" + 0.003*"成长"')]
每个文档的主题分布:
[(0, 0.06384071), (1, 0.03456587), (2, 0.90159345)]
[(0, 0.8885633), (1, 0.055778004), (2, 0.055658694)]
[(0, 0.040150456), (1, 0.9160378), (2, 0.043811753)]  
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值