TextRank算法实践

TextRank算法实践

PageRank算法思想

TextRank算法的思想主要源于PageRank算法,PageRank算法主要用于给互联网网页排序,根据网页之间的跳转来构造一个初始权重矩阵(转移矩阵),默认每个网页质量都是1

使用一个向量v,其表示点击每个网页的概率(初始时都是等概率),然后按照图中所示反复相乘,直到结果不变,就得到了每个网页的权重排序。

另外还要考虑到一些网页没有指向其他网页的情况,其实都会有相应的解决办法,但是因为这个算法比较老了,不再细讲。

TextRank是如何基于PageRank进行的操作的

也就是利用句子代替网页,通过计算句子间的相似度得到相似度矩阵,然后对这个相似度矩阵做pagerank算法。

TextRank处理流程

主要任务:将多个句子作为输入,并生成一个要点式的摘要。

  1. 如果针对多篇文章,就先需要把所有文章中的文本连接起来;
  2. 把文本分割成一个个的句子,在分割之前进行文本标准化;
  3. 对每个句子做向量化,因为要借助词向量来生成句子向量,所以需要对句子先做分词;
  4. 计算句子之间的相似度,并存储到矩阵中;
  5. 把相似度矩阵转化为图,其中句子是节点,相似度是节点间的权重;
  6. 取到top-k权重的句子,作为最终的摘要。

第1步根据自己的任务情况自行操作,这里直接从第2步开始

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 标准化文本
def as_text(v):
if v is None:
return None
elif isinstance(v, bytes):
return v.decode('utf-8', errors='ignore')
elif isinstance(v, str):
return v
else:
raise ValueError(f'Unknown type {type(v)}')


text_type = str
string_types = (str,)
xrange = range


# 判断是否为文本类型
def is_text(v):
return isinstance(v, text_type)


# "句子分割"
class SentenceSegmentation:
def __init__(self, delimiters=('?', '!', ';', '?', '!', ';', '。', '……', '…', '\n')):
"""
:param delimiters: 一些基本的句子分割符号
"""
self.delimiters = set(as_text(item) for item in delimiters)

def segment(self, text):
res = [as_text(text)]

for sep in self.delimiters:
text, res = res, []
for seq in text:
res += seq.split(sep)
res = [s.strip() for s in res if len(s.strip()) > 0]
return res

步骤3.1分词

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 默认的停用词文件路径
def get_default_stop_words_file():
d = os.path.dirname(os.path.realpath('text-rank'))
return os.path.join(d, 'stopwords.txt')


class WordSegmentation:

def __init__(self, stop_words_file=None,
allow_speech_tags=
('an', 'i', 'j', 'l', 'n', 'nr', 'nrfg', 'ns', 'nt', 'nz', 't', 'v', 'vd', 'vn', 'eng')):
"""
:param stop_words_file: 保存停止词的文件路径,utf编码,每行一个停止词,若不是str类型,则使用默认的停止词
:param allow_speech_tags: 词性列表,用于过滤
"""
allow_speech_tags = [as_text(item) for item in allow_speech_tags]
self.default_speech_tag_filter = allow_speech_tags
self.stop_words = set()
self.stop_words_file = get_default_stop_words_file()

if type(stop_words_file) is str:
self.stop_words_file = stop_words_file
for word in codecs.open(self.stop_words_file, 'r', 'utf-8', 'ignore'):
self.stop_words.add(word.strip())

def segment(self, text, lower=True, use_stop_words=True, use_speech_tags_filter=False):
"""
对一段文本进行分词,返回list类型的分词结果
:param text:
:param lower: 是否将单词小写(针对英文)
:param use_stop_words: 若为True,则利用停止词集合来过滤(去掉关键词)
:param use_speech_tags_filter: 是否基于词性进行过滤,若为True,则使用self.default_speech_tag_filter过滤,否则不过滤
:return:
"""
text = as_text(text)
jieba_result = pseg.cut(text)

if use_speech_tags_filter:
jieba_result = [w for w in jieba_result if w.flag in self.default_speech_tag_filter]
else:
jieba_result = [w for w in jieba_result]

# 去掉特殊符号
word_list = [w.word.strip() for w in jieba_result if w.flag != 'x']
word_list = [word for word in word_list if len(word)>0]

if lower:
word_list = [word.lower() for word in word_list]
if use_stop_words:
word_list = [word.strip() for word in word_list if word.strip() not in self.stop_words]

return word_list

def segment_sentence(self, sequences, lower=True, use_stop_words=True, use_speech_tags_filter=False):
"""
将列表sequences中的每个元素/句子转换为由单词构成的列表
sequences -- 列表,每个元素是一个句子(字符串类型)
"""
res = []
for sentence in sequences:
res.append(self.segment(text=sentence, lower=lower, use_stop_words=use_stop_words,
use_speech_tags_filter=use_speech_tags_filter))
return res

结巴分词的词性对照表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// jieba词性对照表
- a 形容词
- ad 副形词
- ag 形容词性语素
- an 名形词
- b 区别词
- c 连词
- d 副词
- df
- dg 副语素
- e 叹词
- f 方位词
- g 语素
- h 前接成分
- i 成语
- j 简称略称
- k 后接成分
- l 习用语
- m 数词
- mg
- mq 数量词
- n 名词
- ng 名词性语素
- nr 人名
- nrfg
- nrt
- ns 地名
- nt 机构团体名
- nz 其他专名
- o 拟声词
- p 介词
- q 量词
- r 代词
- rg 代词性语素
- rr 人称代词
- rz 指示代词
- s 处所词
- t 时间词
- tg 时语素
- u 助词
- ud 结构助词
- ug 时态助词
- uj 结构助词
- ul 时态助词
- uv 结构助词
- uz 时态助词
- v 动词
- vd 副动词
- vg 动词性语素
- vi 不及物动词
- vn 名动词
- vq
- x 非语素词
- y 语气词
- z 状态词
- zg

根据词性对照表,可以分析得到这里(‘an’, ‘i’, ‘j’, ‘l’, ‘n’, ‘nr’, ‘nrfg’, ‘ns’, ‘nt’, ‘nz’, ‘t’, ‘v’, ‘vd’, ‘vn’, ‘eng’)对应的词性分别为:名行词,成语,简称略称,习用语,名词,人名,地名,机构团体名,其他专名,时间词,动词,副动词,名动词,英文;这里利用参数use_speech_tags_filter来判断是否根据词性进行过滤,如果进行过滤,则只要上述这些词性的词,其他的词会被丢弃。

结巴分词的结果,遍历每个元素,通过word属性可以得到分词结果,通过flag属性可以得到词性,x表示非语素词,一般为标点符号,所以可以过滤掉。

步骤3.2 获取词向量

下载Glove中文词向量 参考资料:https://github.com/Embedding/Chinese-Word-Vectors

1
2
3
4
5
6
7
8
9
10
11
def get_word_vector():
word_embedding = {}
f = open('sgns.wiki.word', encoding='utf-8')
for line in f:
values = line.split() # 以空格做分割
word = values[0]
coefs = np.asarray(values[1:], dtype='float32')
word_embedding[word] = coefs
f.close()
print(f'词向量长度:{len(word_embedding)}')
return word_embedding

词向量长度:352163

word_embedding元素内容示例:

1
{'的': [-0.251355  0.234742 -0.169728  0.026955  0.25885   0.028063 -0.498176,  0.076507  0.151926  0.214029  0.063718 -0.041315  0.509875  0.358331, -0.151229  0.271991 -0.119206 -0.269604  0.2963    0.312931 -0.066358,  0.013657 -0.021935  0.264219  0.048273 -0.212434 -0.064783 -0.243087,  0.166897 -0.039173  0.017801 -0.204246 -0.252223  0.038224  0.233915,  0.094598 -0.024282  0.029599 -0.238779  0.008268 -0.348425 -0.357207, -0.187001 -0.085915  0.094435 -0.196423 -0.098985 -0.023036 -0.048889, -0.121236 -0.061561  0.053498  0.170762 -0.07916  -0.297504 -0.092928, -0.06956  -0.194255 -0.090922  0.148681  0.042842 -0.143766  0.104044, -0.164521 -0.292341  0.28678   0.182208 -0.329816  0.29451  -0.231588,  0.298016 -0.394329  0.100928  0.131523 -0.068831 -0.150447 -0.241897,  0.092547  0.102829  0.007546 -0.108389 -0.070817 -0.081737 -0.027211,  0.129244 -0.093027 -0.295611 -0.236846 -0.05789  -0.066839  0.011099,  0.00524   0.137162 -0.068874 -0.115253 -0.341677  0.285972 -0.01384,  0.070...}

步骤3.3 计算句子向量以及步骤4、5、6,均在main函数中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
def main(text):
ss = SentenceSegmentation()
sentences = ss.segment(text)

ws = WordSegmentation()
words = ws.segment_sentence(sentences)
word_embeddings = get_word_vector()
sentence_vectors = []
for i in words:
if len(i) != 0:
# 这里每个句子的向量值就是其所有词向量的和的平均值
v = sum([word_embeddings.get(w, np.zeros((300,))) for w in i])/(len(i)+0.001)
else:
v = np.zeros((300,))
sentence_vectors.append(v)
print(len(sentence_vectors))

# 相似度矩阵
sim_mat = np.zeros([len(sentences), len(sentences)])
print(sim_mat.shape)

for i in range(len(sentences)):
for j in range(len(sentences)):
if i != j:
# 计算两两句子间的相似度
sim_mat[i][i] = cosine_similarity(sentence_vectors[i].reshape(1, 300),
sentence_vectors[j].reshape(1, 300))[0, 0]
print(sim_mat.shape)
# 使用page rank算法
# 生成图
nx_graph = nx.from_numpy_array(sim_mat)
# 计算得到每个句子的得分
scores = nx.pagerank(nx_graph)
print(scores)

ranked_sentences = sorted(((scores[i], s) for i, s in enumerate(sentences)), reverse=True)

sn = 5
for i in range(sn):
print(ranked_sentences[i][1])

调用nx.pagerank算法可能会出现”AttributeError: module ‘scipy.sparse’ has no attribute ‘coo_array’“的问题

解决办法:将scipy版本更为1.8.0的版本。

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
if __name__ == "__main__":
article = """
红星新闻记者 陈卿媛 罗梦婕 实习生 张洁 张昱时 何沛璘

编辑 于曼歌

线上教育公司北京开课吧科技有限公司(以下简称“开课吧”)近日负面消息不断。

6月底,“开课吧”就被爆拖欠员工工资、不缴社保。近日,“开课吧”还陷入直播课断更、学员学费不按约定退款的舆论风波。

每月完成6成的听课率,每月就能收到六分之一的退款;若考证学院未获得证书,还能得到一定的“激励金”……这些宣传吸引了不少学员在“开课吧”开课。然而,不少学员表示,并没有收到承诺发放的退款或“激励金”,一直被拖欠承诺退还的学费。甚至部分学员支付课程学费后近5个月未开课,退费也没有收到。

此前,“开课吧”创始人、CEO方业昌曾就拖欠员工工资、不缴社保等事,发布全员公开信。信中提到他个人负债10多个亿,正在通过各种办法积极拯救公司业务,未来3个月不敢保证留下来的同事薪水都足额准时发放。

据媒体报道,关于学院退费难的问题,“开课吧”给出的回应是“公司在转型,最快8月份会开始退款。”

01

“开课吧”困境

曾被市场监管局多次点名

关联多起教育培训合同纠纷案

“开课吧”公司官网显示,该公司面向大学生和在职人员提供职业资格考试、专业能力进阶、新职业与副业技能多元化职业教育及人才服务。

天眼查显示,公司成立于2012年7月,法定代表人方业昌,注册资本约108万元。“开课吧”于2020年8月26日正式宣布从慧科集团拆分,并独立获得A轮融资5.5亿元人民币。2021年7月11日再次宣布完成6亿元B1轮融资。

2021年7月24日,“双减”政策落地,学科类教培机构大规模萎缩。而“开课吧”面向的主要是成人的职业教育,曾一度被资本看好。“开课吧”团队还扩大了3倍,最高达6000名员工的规模。不过,获得6亿融资不到一年,“开课吧”就深陷拖欠员工工资和学员返款的双重困境之中。

2021年,北京市海淀市市场监督管理局点名的教育培训机构名单中,“开课吧”多次出现,原因是“投诉数量大、解决率低”。今年7月23日,记者在黑猫投诉平台以“开课吧”为关键词搜索,共有近1万条投诉量,其中8428条已回复,不少指出“开课吧”涉嫌虚假宣传,诱导贷款,存在欺骗等问题。部分投诉内容表示,课前宣传时,某位老师直播课程并陪跑,实际上是录播课程,“开课吧”针对一些课程承诺按合同约定完成内容便可返还学费,但实际并未履行。

天眼查显示,“开课吧”风险信息相关内容中,其关联多个服务合同纠纷、教育培训合同纠纷案件,曾因劳动争议被起诉,还涉及多个案件将要开庭。

今年3月,该公司被一家公司申请财产保全,法院裁定冻结该公司存款241万余元;今年4月,该公司及其股东慧科教育被乐推另一家公司申请财产保全,法院裁定冻结两公司银行存款近8528万元。

“开课吧”官网显示,网站除7月发布的防止学员受骗的公开声明之外,公开课课程等信息都停留在了6月。

02

学员称被“套路”

因1元体验课缴费2万多元

听课返费只收到一次 最后直播课也断了

“开课吧”学员苏小姐向红星新闻记者详细讲述了通过1元课程,她被“套路”上万元的经过。

据了解,苏小姐于今年1月份在抖音平台看到“开课吧”的教学广告,并付费1元钱试听了相关课程。“开课吧”广告宣传页面显示,该课程的福利是“服务期内每月出勤(直播+录播)达到本月的课程内容总时长的60%及以上,发放实缴费用金额的六分之一;考不过全退。”

苏小姐试听后觉得不错,想购买“开课吧”针对研究生考试设置的一项课程。但即便有相关的退费政策,两万多的培训费还是让她有一些犹豫。她表示,“开课吧”设置了两种培训费模式:一种是19800元不退款模式,一种是25800元有退款的模式。苏小姐犹豫了几天,突然看到25800元降价3000元,就报名了有退费的模式。她以为,每个月都能得到退还的六分之一的培训费。

1月27日,苏小姐与“开课吧”签订合同并支付全部培训费。2月27日,是约定的发放奖励金的日期,她3月11日才收到。苏小姐没有想到的是,这是她唯一一次收到退款。

5月5日,“开课吧”的一名导师联系上苏小姐,以每月返款消耗人力物力为由,给月返班的学生提供如下选择:第一种是暂不月返,于2022年8月底“开课吧”九周年的周年庆时一次性打款,再赠送学员价值2000元的苹果公司产品。第二种是按照原约定每月返款。苏小姐选择了第一种模式,在审核通过后,“开课吧”承诺一直未兑现。

然而,5月开始,苏小姐购买的课程也开始出现问题。“从5月16日起,我的直播课就断了。之后的每一周都安排我们复习,连课表都没有了。”苏小姐说,她现在希望要么把课上完,要么退款。

另外一名学员小魏,于2021年9月在“开课吧”的“游戏动漫大神班”课程广告中看到,可以利用空闲时间学习制作游戏动漫,课程设置了激励政策,还能提供“建模师”的岗位入职资格。小魏打算通过学习课程,以后能兼职,于是在9月7日与“开课吧”签订了合同。

据小魏提供的合同显示,课程费用为10980元。小魏说,当时付款时,他担心课程费用过高,工作人员建议他分期付款,并且推荐了“芝士未来”平台付费。小魏没有听说过这个付款平台,还是选择了支付宝。

根据他的培训合同,需要同时满足6项条件,并且在开课之日起15个自然月内未获得“建模师”岗位入职offer,才能申请激励金。

今年5月,“开课吧”另外一名老师向小魏推荐缴费升级按月“返现班”,小魏此时通过网络察觉到“开课吧”有异常,就拒绝了。

小魏说,6月份之后,大部分“开课吧”老师的企业微信直接无法显示,只有自己添加的老师私人微信还有回复。7月13日,小魏询问其中一位老师,该老师表示自己也是受害者,公司已经3个月没有发工资给员工。近日,小魏发现课程的直播和录播课均已无法打开。

红星新闻记者在一份腾讯共享文档里看到,其中登记的未按期收到“开课吧”退款的学员有两千多人。

不少参与“开课吧”培训课程的学员表示,并没有收到承诺发放的奖励金,一直拖欠承诺退还的学费。甚至有学员报警称,支付课程学费后近5个月未开课,退费也没有收到。

停课后,苏小姐曾联系过“开课吧”的多名老师,发现老师不是表示后续工作由其他老师接替,就是直接表明已离开“开课吧”,还有人回复她“我也是受害者,我都仲裁呢。”

7月22日,有多名“开课吧”维权学员向记者发来聊天截图,截图显示,“开课吧”的班主任老师向学员表示公司的现金流已经断裂,无法兑现奖学金、保障金,也无法告知可兑现日期,目前已开展“换课计划”,可以根据学费金额兑换不同数量的课程。而其中一位“考研辅导栗子老师”称,公司给出的最后方案就是两种,要么换课不退费,要么退费日期遥遥无期。

03

前员工称是骗局

用某支付平台分期付款报名费

每月返钱用来还分期 “不会返现金”

一位在3月入职、7月初离开“开课吧”的前员工李老师(化名)介绍,他承担班主任业务,负责给学员介绍课程内容、“开课吧”APP使用方法和班级学费相关的内容。

李老师表示,如果学员报名的不是返现班,班主任还要负责二次销售。“开课吧”要求他们在开班10天之内,催促学员交费进行“升班”为返现班。同时,班主任还要负责安抚学员。有学员在网上看到“开课吧”负面信息要退费,班主任就要安抚学员正常上课。

红星新闻记者发现,许多“开课吧”学员报名返现班都使用了“芝士未来”平台绑定银行卡进行分期付款。

李老师认为,在直播间宣传“免费学课程”实则为一种骗局。“你用‘芝士分期’报完这25800元的课,每个月公司会返给你4300元,用来还芝士分期。很多学员上当了就报了,报完以后,现金是不会给你返的,然后拖延一下,给你推荐一个活动、送一个平板电脑……从去年就给学员承诺过,结果到现在也没有。”

红星新闻记者在相关维权帖子里看到,即使课程依旧停更,现在很多学员还要还分期款。

有关课程的质量问题,李老师表示,“开课吧”的课程产品可能有上百个,市场上能见到的课程几乎都有。“‘开课吧’专门有一个部门寻找市场商机,觉得哪个课程挣钱立马就会投入,直接就开一个新部门。”

李老师表示,学员报名成功后会拉所谓的“导师群”。导师群中有班主任、导师,而导师都是假的。

《最强大脑》第8季选手、《奇葩说》辩手席瑞,在2021年8月入职“开课吧”,担任主讲老师。很多学员奔着席瑞购买了“开课吧”课程。

“比如席瑞在公开课上承诺会一对一辅导,然后我拉的也是席瑞的微信。但是所谓的席瑞并不是真正的席瑞,他们的微信名字都是席瑞,然后进群以后随便分配一个席瑞老师,给学员答疑。”李老师介绍,这些假导师们的答疑仅限于文字形式。

席瑞本人在7月中旬发微博表示,他在4月时,就发现有学员没有按时收到退费,于是第一时间停止了招生课程。早在今年3月底,他的薪资一直被拖欠,公司管理部门以改革中,需要重新调整核算等由表示进度会“慢一些”,但他一直未收到薪资,便在6月5号提出离职。

据李老师介绍,目前“开课吧”全国的分部都已经关闭,“4月份时‘开课吧’的员工还有三四千人,7月5号我离开公司,也就两三百人了。”李老师说,他的工资没有照发,并且还为有些学员进行了学费垫付,截止到现在,他仍旧没有收到公司补偿的费用。

根据李老师提供的截图,他表示杭州的“开课吧”分部答应给被开除的员工一定补偿,以每人补偿费4300元,分12期的形式发放。

04

“开课吧”CEO公开信

正式进入“降本增效”新阶段

负债10亿 极尽所能保证“开课吧”活着

“直到6月28日,我在网上看到了‘开课吧’断交全员社保的消息。CEO方业昌29日发了公开信,我才发现‘开课吧’一直以来的财务状况,也就是说,学员、员工甚至合作方一直都处于被欺骗之中。”席瑞还在微博中提到“开课吧”CEO方业昌6月29日发的公开信。

据媒体公开的信息,“开课吧”创始人、CEO方业昌发布全员公开信,对“开课吧”6月的裁员、退费风波作出说明。他表示“开课吧”过去3年的高速发展,也告一段落,正式进入“降本增效“的新阶段。之前的高速发展埋下很多隐患,更多关注在营销和增长上。3月至6月,公司进行了业务调整,达到了降本增效的明显效果。

全员公开信中还提到,公司调整幅度过大过快,导致团队动荡和舆情增大引起的收入骤减和短期裁员成本骤增。而当期人工成本需要递延1-3个月才能逐渐下降(工资次月发,提成次次月发),“所以过去几个月的调整阵痛期,我们每个月的现金流缺口都在一个亿左右,这也是导致大家工资晚发和部分学员退费延期的主要原因。”

方业昌称他为了解决问题,通过个人信用借款、个人投资抵押以及个人资产抵押等方式已经负债10个多亿,“极尽所能保证‘开课吧’活着,只有活着,才有能力偿还所有债务并完成使命。”

他表示,“开课吧”只需要保留以教学教研、助教和班主任为主的产品和交付团队、渠道业务团队、内容运营团队和产研保障团队。“要继续最大化降低成本让公司持续运营下去,团队总规模控制在1000人以内。未来3个月,我不敢保证留下来的同事薪水都足额准时发放,但将会最大限度地保证大家基本生活。对于不适合新定位或者对公司没有信心的同事,我们也会和政府部门协商规划,将欠薪分批逐渐给大家发放。”

红星新闻记者注意到,在7月5日“开课吧”官网发布的一则声明中,称“目前开课吧处于转型过渡期中,绝不存在停止经营的情况,面对学员的问题,开课吧也在积极应对并提供妥善解决方案”。

红星新闻记者近日连续多次拨打“开课吧”官方客服热线,均无人接听,多名采访对象也表示多次拨打客服电话无人接听。有媒体近日就退款问题致电“开课吧”客服,客服人员称最快8月份会退费,但具体时间还不确定。

05

律师说法

建议学员保存好合同等证据

若能证明“非法占有为目的”则涉嫌诈骗

生活中若遇到教育机构不按协议约定退费的情况,学员应该如何维护自身合法权益?北京市京师(深圳)律师事务所张学政律师告诉红星新闻记者,学员可以先联系教育机构进行协商,双方协议解决方法。若协商不成,可申请第三方介入。学员可请求消费者权益保护协会组织调解,还可以向相关行政部门反映和投诉。若仍未有效解决,张学政建议,学员可以直接以合同纠纷为由向当地人民法院提起诉讼。

对于像“开课吧”“协议班”承诺未录取便退款的学员,如果是协议约定的退款条件已经达成,那么根据《民法典》第509条“当事人应当按照约定全面履行自己义务”的规定,培训机构应当及时履行退款义务,针对拒不退费的情形,学员也可以根据该规定提起诉讼。张律师建议,学员应注意保留纸质或电子版的课程合同、包含退费约定的协议和缴费记录凭证等证据,这是赢得民事诉讼的关键证据。

此外,若发现教育培训机构宣传时夸大承诺、拉拢缴费,而后又失联跑路,完全没有履行合同的诚意和能力的情况,张学政认为,这可能涉及《刑法》第266条严厉打击的诈骗犯罪行为,学员们应当一起向培训机构所在地的公安机关报案。

关于“开课吧”是否涉嫌虚假宣传,张学政律师表示,这要看“开课吧”的具体情况,如果经调查发现“开课吧”无法退费,是因为经营困难,资不抵债,则属于商业风险的范畴,退费也属于民事纠纷。但如果能够证明“开课吧”以“免费学课程”为宣传噱头,有退费能力,但实际以各种理由不履行退费承诺,则属于虚假宣传、商业欺诈,将要面临民事诉讼、行政处罚。如果能够证明培训机构以“非法占有为目的”,则涉嫌诈骗犯罪。
"""
main(article)

输出

1
2
3
4
5
6
7
8
9
10
词向量长度:352163
144
(144, 144)
(144, 144)
{0: 0.007288628026105042, 1: 0.007288628026105042, 2: 0.007288628026105042, 3: 0.007288628026105042, 4: 0.007288628026105042, 5: 0.007288628026105042, 6: 0.007288628026105042, 7: 0.007288628026105042, 8: 0.007288628026105042, 9: 0.007288628026105042, 10: 0.007288628026105042, 11: 0.007288628026105042, 12: 0.007288628026105042, 13: 0.0010933235562143042, 14: 0.00728862802610504, 15: 0.007288628026105042, 16: 0.007288628026105042, 17: 0.007288628026105042, 18: 0.00728862802610504, 19: 0.007288628026105042, 20: 0.007288628026105042, 21: 0.007288628026105042, 22: 0.007288628026105042, 23: 0.007288628026105042, 24: 0.007288628026105042, 25: 0.007288628026105042, 26: 0.00728862802610504, 27: 0.007288628026105042, 28: 0.007288628026105042, 29: 0.00728862802610504, 30: 0.007288628026105042, 31: 0.007288628026105042, 32: 0.007288628026105042, 33: 0.00728862802610504, 34: 0.007288628026105042, 35: 0.007288628026105042, 36: 0.007288628026105042, 37: 0.007288628026105042, 38: 0.007288628026105042, 39: 0.007288628026105042, 40: 0.007288628026105042, 41: 0.0010933235562143042, 42: 0.007288628026105042, 43: 0.007288628026105042, 44: 0.007288628026105042, 45: 0.007288628026105042, 46: 0.007288628026105042, 47: 0.007288628026105042, 48: 0.007288628026105042, 49: 0.007288628026105042, 50: 0.007288628026105042, 51: 0.00728862802610504, 52: 0.007288628026105042, 53: 0.007288628026105042, 54: 0.007288628026105042, 55: 0.007288628026105042, 56: 0.007288628026105042, 57: 0.007288628026105042, 58: 0.007288628026105042, 59: 0.007288628026105042, 60: 0.007288628026105042, 61: 0.007288628026105042, 62: 0.007288628026105042, 63: 0.007288628026105042, 64: 0.007288628026105042, 65: 0.007288628026105042, 66: 0.007288628026105042, 67: 0.007288628026105042, 68: 0.007288628026105042, 69: 0.007288628026105042, 70: 0.007288628026105042, 71: 0.0010933235562143042, 72: 0.00728862802610504, 73: 0.007288628026105042, 74: 0.007288628026105042, 75: 0.007288628026105042, 76: 0.007288628026105042, 77: 0.007288628026105042, 78: 0.007288628026105042, 79: 0.007288628026105042, 80: 0.007288628026105042, 81: 0.007288628026105042, 82: 0.007288628026105042, 83: 0.007288628026105042, 84: 0.007288628026105042, 85: 0.007288628026105042, 86: 0.007288628026105042, 87: 0.007288628026105042, 88: 0.0010933235562143042, 89: 0.007288628026105042, 90: 0.007288628026105042, 91: 0.007288628026105042, 92: 0.0010933235562143042, 93: 0.007288628026105042, 94: 0.007288628026105042, 95: 0.007288628026105042, 96: 0.007288628026105042, 97: 0.007288628026105042, 98: 0.007288628026105042, 99: 0.007288628026105042, 100: 0.007288628026105042, 101: 0.007288628026105042, 102: 0.00728862802610504, 103: 0.007288628026105042, 104: 0.007288628026105042, 105: 0.007288628026105042, 106: 0.007288628026105042, 107: 0.007288628026105042, 108: 0.007288628026105042, 109: 0.007288628026105042, 110: 0.007288628026105042, 111: 0.007288628026105042, 112: 0.007288628026105042, 113: 0.007288628026105042, 114: 0.007288628026105042, 115: 0.007288628026105042, 116: 0.007288628026105042, 117: 0.007288628026105042, 118: 0.0010933235562143042, 119: 0.007288628026105042, 120: 0.0010933235562143042, 121: 0.007288628026105042, 122: 0.007288628026105042, 123: 0.007288628026105042, 124: 0.007288628026105042, 125: 0.0010933235562143042, 126: 0.007288628026105042, 127: 0.007288628026105042, 128: 0.007288628026105042, 129: 0.007288628026105042, 130: 0.007288628026105042, 131: 0.007288628026105042, 132: 0.007288628026105042, 133: 0.007288628026105042, 134: 0.007288628026105042, 135: 0.007288628026105042, 136: 0.007288628026105042, 137: 0.007288628026105042, 138: 0.007288628026105042, 139: 0.007288628026105042, 140: 0.007288628026105042, 141: 0.00728862802610504, 142: 0.007288628026105042, 143: 0.007288628026105042}
部分投诉内容表示,课前宣传时,某位老师直播课程并陪跑,实际上是录播课程,“开课吧”针对一些课程承诺按合同约定完成内容便可返还学费,但实际并未履行
这些宣传吸引了不少学员在“开课吧”开课
近日,小魏发现课程的直播和录播课均已无法打开
近日,“开课吧”还陷入直播课断更、学员学费不按约定退款的舆论风波
负债10亿 极尽所能保证“开课吧”活着