%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
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
with open('LDA-data/stop_words.txt','r', encoding='gbk') as f:
content = f.read()
stop_list = set(content.splitlines())
stop_list.add(' ')
df = pd.read_csv('LDA-data/sample_1000.txt', sep='\t')
labels = df['标签'].unique()
labels
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()
经历 标签 cutted
0 帮公司新募全新团队,成功引入一批责任心强,能战斗,懂管理的M1/M2经理队伍,现已成长为华存... 组建团队 [帮, 公司, 新募, 全新, 团队, 成功, 引入, 一批, 责任心, 强, 战斗, 懂,...
1 6. 突发事件应对及危机管理 危机处理 [突发事件, 应对, 危机, 管理]
2 4、处理各种突发性事件 危机处理 [处理, 突发性, 事件]
3 负责垂类新客券的设计和开发 市场开拓 [负责, 垂类, 新, 客券, 设计, 开发]
4 8、做好市场危机公关处理 危机处理 [做好, 市场, 危机, 公关, 处理]
all_docs = {}
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
{'组建团队': ['帮',
'公司',
'新募',
'全新',
'团队',
'成功',
'引入',
'一批',
...
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()]
txts = all_txts[n:m]
keys = all_keys[n:m]
print(keys)
dictionary = corpora.Dictionary(txts)
corpus = [dictionary.doc2bow(txt) for txt in txts]
corpus_tfidf = models.TfidfModel(corpus)[corpus]
length = m-n
if tfidf:
lda = models.LdaModel(corpus_tfidf, num_topics=length, id2word=dic)
print('每个主题的词分布:')
pprint(lda.print_topics(num_topics=length, num_words=10))
print('每个文档的主题分布:')
for doc_topic in lda[corpus_tfidf]:
print(doc_topic)
else:
lda = models.LdaModel(corpus, num_topics=length, id2word=dic)
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)
['组建团队', '危机处理', '市场开拓']
每个主题的词分布:
[(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)
['组建团队', '危机处理', '市场开拓']
每个主题的词分布:
[(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)]