import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#import seaborn as sns
plt.rcParams['font.sans-serif'] = ['KaiTi'] #指定默认字体 SimHei黑体
plt.rcParams['axes.unicode_minus'] = False #解决保存图像是负号'
import jieba
import os
# stop_list = pd.read_csv("停用词.txt",index_col=False,quoting=3,sep="\t",names=['stopword'], encoding='utf-8')
df = pd.read_csv('软件项目风险管理论文.csv', encoding='utf-8')
df
主题 | 摘要 | |
---|---|---|
0 | 浅谈软件项目管理中的成本效益和收益管理 | 软件项目实施的主要目标就是实现经济效益。在软件项目管理过程中,必须对所要研发的软件开展经济学... |
1 | J公司用户中心系统项目风险管理研究 | 随着社会环境的变化,项目风险管理的重要性日渐凸显,特别是软件项目,这类项目大多迭代快,在这过... |
2 | 敏捷软件项目风险管理探析 | 在敏捷实践中敏捷方法有利于降低项目风险,但它们通常不足以应对在某些场景(例如在高度规范的领域... |
3 | B公司A软件项目风险管理 | 近年来,软件产品市场高速发展,信息安全也越来越被大家所关注,SM(国家涉密信息)软件行业更是... |
4 | S公司敏捷开发互联网软件项目的风险管理 | 随着科技的不断进步发展,信息技术发展至今已经非常成熟,其已经被广泛用于各行各业当中。为顺应时... |
... | ... | ... |
592 | 长沙软件园有限公司项目管理成熟度评价研究 | 长沙软件园有限公司具体负责长沙国家软件产业基地的专业基础设施、软件开发环境建设及技术创新运营... |
593 | 基于3G技术的“移动勘险”项目管理研究 | 随着世界移动互联网及物联网、云计算技术的发展,3G技术的优势得到了充分的发挥。智能手机的普及... |
594 | 软件项目风险管理之探索 | 随着IT科技的飞速发展,软件项目的风险管理成为项目实施成功与否的重要环节。该文通过风险计划编... |
595 | 软件项目风险管理过程探析 | 软件项目风险管理是一个基于过程的管理。是对整个项目生命周期内可能遇到的风险进行预测、识别、分... |
596 | SG公司人力资源管理信息系统开发项目的进度计划与控制研究 | 随着现代信息技术的发展,信息化管理软件逐渐成为现代企业提高效率、增加效益不可或缺的必要工具与... |
597 rows × 2 columns
#Jieba分词函数
def IsChinese(character):
'''判断是否为中文字符'''
for cha in character:
if not '\u0e00' <= cha <= '\u9fa5':
return False
else:
return True
jieba.load_userdict('no_split.txt')
key_words = set()
with open('no_split.txt', encoding='utf-8') as f:
for line in f:
l = line.strip()
if l:
key_words.add(l)
print('key_words', len(key_words))
stop_list = []
def txt_cut(juzi):
# lis=[w for w in jieba.cut(juzi) if w not in stop_list]
# lis=[w for w in jieba.cut(juzi) if IsChinese(w)]
lis=[w for w in jieba.cut(juzi) if w in key_words]
return (" ").join(lis)
df['cutword']=df['摘要'].astype('str').apply(txt_cut)
df
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\wangkai\AppData\Local\Temp\jieba.cache
Loading model cost 0.718 seconds.
Prefix dict has been built successfully.
key_words 362
主题 | 摘要 | cutword | |
---|---|---|---|
0 | 浅谈软件项目管理中的成本效益和收益管理 | 软件项目实施的主要目标就是实现经济效益。在软件项目管理过程中,必须对所要研发的软件开展经济学... | |
1 | J公司用户中心系统项目风险管理研究 | 随着社会环境的变化,项目风险管理的重要性日渐凸显,特别是软件项目,这类项目大多迭代快,在这过... | 项目风险 项目风险 项目风险 项目风险 项目风险 客户需求不明确 项目风险 沟通风险 项目风险 |
2 | 敏捷软件项目风险管理探析 | 在敏捷实践中敏捷方法有利于降低项目风险,但它们通常不足以应对在某些场景(例如在高度规范的领域... | 项目风险 项目风险 项目风险 项目风险 项目风险 |
3 | B公司A软件项目风险管理 | 近年来,软件产品市场高速发展,信息安全也越来越被大家所关注,SM(国家涉密信息)软件行业更是... | 需求风险 技术风险 人员风险 管理风险 需求风险 技术风险 人员风险 管理风险 需求风险 需... |
4 | S公司敏捷开发互联网软件项目的风险管理 | 随着科技的不断进步发展,信息技术发展至今已经非常成熟,其已经被广泛用于各行各业当中。为顺应时... | 项目风险 开发风险 开发风险 |
... | ... | ... | ... |
592 | 长沙软件园有限公司项目管理成熟度评价研究 | 长沙软件园有限公司具体负责长沙国家软件产业基地的专业基础设施、软件开发环境建设及技术创新运营... | |
593 | 基于3G技术的“移动勘险”项目管理研究 | 随着世界移动互联网及物联网、云计算技术的发展,3G技术的优势得到了充分的发挥。智能手机的普及... | |
594 | 软件项目风险管理之探索 | 随着IT科技的飞速发展,软件项目的风险管理成为项目实施成功与否的重要环节。该文通过风险计划编... | 项目风险 |
595 | 软件项目风险管理过程探析 | 软件项目风险管理是一个基于过程的管理。是对整个项目生命周期内可能遇到的风险进行预测、识别、分... | 项目风险 项目风险 项目风险 |
596 | SG公司人力资源管理信息系统开发项目的进度计划与控制研究 | 随着现代信息技术的发展,信息化管理软件逐渐成为现代企业提高效率、增加效益不可或缺的必要工具与... |
597 rows × 3 columns
import jieba.analyse
text = ''
for i in range(len(df['cutword'])):
text += df['cutword'][i]+'\n'
jieba.analyse.extract_tags(text,topK=20,withWeight=True)
[('项目风险', 8.96327305713358),
('需求变更', 0.434584893820764),
('需求风险', 0.3314630546090573),
('技术风险', 0.32409720895107824),
('管理风险', 0.287267980661183),
('开发风险', 0.15468275881756008),
('人力资源风险', 0.147316913159581),
('过程风险', 0.13258522184362292),
('人员风险', 0.11048768486968576),
('沟通风险', 0.08102430223776956),
('项目管理风险', 0.0736584565797905),
('成本超支', 0.058926765263832406),
('进度延期', 0.05156091960585336),
('成本风险', 0.05156091960585336),
('组织风险', 0.05156091960585336),
('技术复杂', 0.03682922828989525),
('团队风险', 0.029463382631916203),
('市场变化', 0.029463382631916203),
('业务风险', 0.029463382631916203),
('项目范围变更', 0.029463382631916203)]
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
from sklearn.decomposition import LatentDirichletAllocation
tf_vectorizer = TfidfVectorizer()
#tf_vectorizer = TfidfVectorizer(ngram_range=(2,2)) #2元词袋
X = tf_vectorizer.fit_transform(df.cutword)
#print(tf_vectorizer.get_feature_names_out())
print(X.shape)
(597, 54)
data1 = {'word': tf_vectorizer.get_feature_names(),
'tfidf': X.toarray().sum(axis=0).tolist()}
df1 = pd.DataFrame(data1).sort_values(by="tfidf" ,ascending=False,ignore_index=True)
df1.head(50)
word | tfidf | |
---|---|---|
0 | 项目风险 | 263.114700 |
1 | 技术风险 | 13.927242 |
2 | 管理风险 | 13.047944 |
3 | 需求风险 | 12.544134 |
4 | 需求变更 | 11.912484 |
5 | 开发风险 | 9.081740 |
6 | 过程风险 | 7.930715 |
7 | 人力资源风险 | 6.603049 |
8 | 人员风险 | 5.521073 |
9 | 成本超支 | 4.871734 |
10 | 进度延期 | 4.674772 |
11 | 项目管理风险 | 4.631457 |
12 | 沟通风险 | 3.740801 |
13 | 技术复杂 | 3.349597 |
14 | 组织风险 | 2.778550 |
15 | 业务风险 | 2.626922 |
16 | 市场变化 | 2.390404 |
17 | 市场风险 | 2.340672 |
18 | 成本风险 | 2.089939 |
19 | 团队风险 | 1.915098 |
20 | 沟通不畅 | 1.903461 |
21 | 合同风险 | 1.551550 |
22 | 项目范围变更 | 1.485818 |
23 | 需求变更频繁 | 1.468582 |
24 | 项目范围风险 | 1.464663 |
25 | 开发环境风险 | 1.295113 |
26 | 更新风险 | 1.288034 |
27 | 风险管理风险 | 1.173554 |
28 | 开发效率低 | 1.000000 |
29 | 员工流失 | 1.000000 |
30 | 用户风险 | 0.988988 |
31 | 运营风险 | 0.970427 |
32 | 产品风险 | 0.892363 |
33 | 管理层不支持 | 0.859065 |
34 | 用户需求变化 | 0.836008 |
35 | 范围变更 | 0.728814 |
36 | 设计不合理 | 0.707107 |
37 | 工作效率低 | 0.707107 |
38 | 项目质量风险 | 0.686501 |
39 | 时间风险 | 0.662809 |
40 | 产品性能不足 | 0.650848 |
41 | 需求不明确或不完整 | 0.640246 |
42 | 管理能力不足 | 0.626602 |
43 | 组织管理风险 | 0.612870 |
44 | 需求不明确 | 0.557005 |
45 | 新技术的使用 | 0.531023 |
46 | 使用新技术 | 0.495843 |
47 | 设计和实现风险 | 0.479658 |
48 | 计划编制风险 | 0.479658 |
49 | 客户需求不明确 | 0.463192 |
n_topics = 4 #分为10类
lda = LatentDirichletAllocation(n_topics=n_topics, max_iter=100,
learning_method='batch',
learning_offset=100,
# doc_topic_prior=0.1,
# topic_word_prior=0.01,
random_state=0)
lda.fit(X)
LatentDirichletAllocation(batch_size=128, doc_topic_prior=None,
evaluate_every=-1, learning_decay=0.7,
learning_method='batch', learning_offset=100,
max_doc_update_iter=100, max_iter=100, mean_change_tol=0.001,
n_jobs=1, n_topics=4, perp_tol=0.1, random_state=0,
topic_word_prior=None, total_samples=1000000.0, verbose=0)
def print_top_words(model, feature_names, n_top_words):
tword = []
tword2 = []
tword3=[]
for topic_idx, topic in enumerate(model.components_):
print("Topic #%d:" % topic_idx)
topic_w = [feature_names[i] for i in topic.argsort()[:-n_top_words - 1:-1]]
topic_pro=[str(round(topic[i],3)) for i in topic.argsort()[:-n_top_words - 1:-1]] #(round(topic[i],3))
tword.append(topic_w)
tword2.append(topic_pro)
print(" ".join(topic_w))
print(" ".join(topic_pro))
print(' ')
word_pro=dict(zip(topic_w,topic_pro))
tword3.append(word_pro)
return tword3
##输出每个主题对应词语和概率
n_top_words = 20
feature_names = tf_vectorizer.get_feature_names()
word_pro = print_top_words(lda, feature_names, n_top_words)
Topic #0:
技术复杂 业务风险 项目范围风险 需求变更频繁 开发效率低 产品性能不足 市场变化 新技术的使用 技术复杂性 项目风险 成本风险 技术风险 开发团队成员缺乏经验 市场风险 成本超支 风险管理风险 开发风险 管理能力不足 需求变更 组织风险
3.597 2.873 1.711 1.709 1.25 0.9 0.819 0.774 0.651 0.262 0.26 0.255 0.254 0.254 0.254 0.253 0.253 0.253 0.253 0.253
Topic #1:
人力资源风险 成本超支 进度延期 沟通风险 需求变更 市场变化 合同风险 项目范围变更 员工流失 运营风险 范围变更 工作效率低 设计不合理 需求不明确 客户需求不明确 技术变更 项目管理风险 项目风险 风险管理风险 技术风险
6.841 5.112 4.924 3.985 2.472 2.07 1.793 1.735 1.249 1.219 0.978 0.957 0.957 0.799 0.708 0.598 0.274 0.263 0.261 0.255
Topic #2:
项目风险 开发风险 市场风险 组织风险 更新风险 风险管理风险 需求不明确或不完整 管理能力不足 开发团队成员缺乏经验 技术复杂性 项目管理风险 客户需求不明确 技术风险 新技术的使用 成本风险 管理风险 成本超支 用户风险 使用新技术 人员风险
263.321 9.299 2.221 1.816 1.534 1.392 0.886 0.871 0.648 0.256 0.255 0.254 0.253 0.253 0.253 0.253 0.253 0.253 0.252 0.252
Topic #3:
技术风险 管理风险 需求风险 需求变更 过程风险 人员风险 项目管理风险 成本风险 团队风险 沟通不畅 开发环境风险 组织风险 用户风险 产品风险 管理层不支持 用户需求变化 项目质量风险 时间风险 组织管理风险 使用新技术
14.164 13.29 12.788 9.937 8.176 5.766 4.851 2.325 2.164 2.151 1.544 1.458 1.235 1.14 1.108 1.084 0.934 0.911 0.86 0.741
#输出每篇文章对应主题
topics=lda.transform(X)
topic=np.argmax(topics,axis=1)
df['topic']=topic
#df.to_excel("data_topic.xlsx",index=False)
print(topics.shape)
print(topics[0])
topic[0]
(597, 4)
[0.25 0.25 0.25 0.25]
0
import random #定义随机生成颜色函数
def randomcolor():
colorArr = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
color ="#"+''.join([random.choice(colorArr) for i in range(6)])
return color
[randomcolor() for i in range(3)]
['#3149B8', '#A4E22C', '#2BE6D5']
from collections import Counter
from wordcloud import WordCloud
from matplotlib import colors
#from imageio import imread #形状设置
#mask = imread('爱心.png')
def generate_wordcloud(tup):
color_list=[randomcolor() for i in range(10)] #随机生成10个颜色
wordcloud = WordCloud(background_color='white',font_path='simhei.ttf',#mask = mask, #形状设置
max_words=20, max_font_size=50,random_state=42,
colormap=colors.ListedColormap(color_list) #颜色
).generate(str(tup))
return wordcloud
dis_cols = 4 #一行几个
dis_rows = 3
dis_wordnum=20
plt.figure(figsize=(5 * dis_cols, 5 * dis_rows),dpi=128)
kind=len(df['topic'].unique())
for i in range(kind):
ax=plt.subplot(dis_rows,dis_cols,i+1)
most10 = [ (k,float(v)) for k,v in word_pro[i].items()][:dis_wordnum] #高频词
ax.imshow(generate_wordcloud(most10), interpolation="bilinear")
ax.axis('off')
ax.set_title("第{}类话题 前{}词汇".format(i,dis_wordnum), fontsize=30)
plt.tight_layout()
plt.show()