TextRank算法实践

TextRank算法实践

PageRank算法思想

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

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

在这里插入图片描述

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

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

在这里插入图片描述

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

TextRank处理流程

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

  1. 如果针对多篇文章,就先需要把所有文章中的文本连接起来;
  2. 把文本分割成一个个的句子,在分割之前进行文本标准化;
  3. 对每个句子做向量化,因为要借助词向量来生成句子向量,所以需要对句子先做分词;
  4. 计算句子之间的相似度,并存储到矩阵中;
  5. 把相似度矩阵转化为图,其中句子是节点,相似度是节点间的权重;
  6. 取到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亿 极尽所能保证“开课吧”活着

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值