TextRank算法实践
PageRank算法思想
TextRank算法的思想主要源于PageRank算法,PageRank算法主要用于给互联网网页排序,根据网页之间的跳转来构造一个初始权重矩阵(转移矩阵),默认每个网页质量都是1
使用一个向量v,其表示点击每个网页的概率(初始时都是等概率),然后按照图中所示反复相乘,直到结果不变,就得到了每个网页的权重排序。
另外还要考虑到一些网页没有指向其他网页的情况,其实都会有相应的解决办法,但是因为这个算法比较老了,不再细讲。
TextRank是如何基于PageRank进行的操作的
也就是利用句子代替网页,通过计算句子间的相似度得到相似度矩阵,然后对这个相似度矩阵做pagerank算法。
TextRank处理流程
主要任务:将多个句子作为输入,并生成一个要点式的摘要。
- 如果针对多篇文章,就先需要把所有文章中的文本连接起来;
- 把文本分割成一个个的句子,在分割之前进行文本标准化;
- 对每个句子做向量化,因为要借助词向量来生成句子向量,所以需要对句子先做分词;
- 计算句子之间的相似度,并存储到矩阵中;
- 把相似度矩阵转化为图,其中句子是节点,相似度是节点间的权重;
- 取到top-k权重的句子,作为最终的摘要。
第1步根据自己的任务情况自行操作,这里直接从第2步开始
# 标准化文本
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分词
# 默认的停用词文件路径
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
结巴分词的词性对照表
// 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
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元素内容示例:
{'的': [-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函数中
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的版本。
测试:
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)
输出
词向量长度: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亿 极尽所能保证“开课吧”活着