Skip to content

Latest commit

 

History

History
43 lines (41 loc) · 38.8 KB

Qa_Cleaner.md

File metadata and controls

43 lines (41 loc) · 38.8 KB
  • QACleaner: Filtering out low-quality data by training a classifier using pre-labeled text quality data.
    • Input:

      • Labeled Data
      //{"text": #input text, "label": 0/1, 0 for high quality, 1 indicating low quality}
      //低质量:赌博/诈骗/低俗色情//营销内容
      {"text": "“酒店招女/男公关”小广告的目的是什么? 帮我改了标题之后似乎把我的原意给模糊了,我是想问:小广告重点是想“招聘女职员”,还是想吸引男人注意去消费。 本人带队直招:(不收取任何形式的押金、进场费、管理费、介绍费等等)。我们客源多而稳定生意红火,绝对不会出现几天上不到班的情况,挣钱不是梦。每个做夜场的女孩都不想东奔西走的找场子,就算日新俩三千,三天打鱼两天晒网,到头来也赚不到什么钱。都想找一个能稳定的可以挣到钱的场子和一个好的领队。如果你们也是这样想的,那么就请相信我,我这里就是你们不二的选择,如果你犹豫了错过了,那就只能怪你们自己", "label": "0"}
      {"text": "如何通俗易懂地解释遗传算法?有什么例子? 大三软件工程学生,以前只听过遗传算法这个名字,但是真正是怎么一回事没有了解过。今天刚好看到  的回答,想起这学期正好选了人工智能这堂课,就觉得想试着码一下这个算法,算是提前预习一下。于是花了两个小时把这个算法大概搞懂了,把思路写一遍,也算是自己再熟悉一遍(如果哪里搞错了请大神们轻喷  理解这个算法首先要理解一些术语。下图(来自 Genetic Algorithms Fundamentals )把术语之间的关系表示的很清楚。 遗传算法就是通过不断地进化,将种群里面我们最想要的染色体保留下来。进化多次之后,种群里的大部分染色体都会是比较优势的染色体(我们想要的解),所以我们可以通过这个算法获取多个较优解。 ps: 关于基因和等位基因的区别:基因(gene)是指染色体上的特定位置,而等位基因(allele)则是当前染色体在该基因处的值。 知道一些术语之间的关系之后,可以试着尝试搞懂算法了。拿@sjyan刚刚这道题做例子。 求解函数 f(x) = x + 10*sin(5*x) + 7*cos(4*x) 在区间[0,9]的最大值。 用遗传算法解这道题的过程, 他说得很清楚,主要是三个阶段: 初始化阶段 确定染色体的形式。先选择一种方式对x进行编码,使其从实际的解空间(phenotype space)被映射到编码空间(genotype space),也就是把实数x变成一条染色体。在这道题中我沿用了@sjyan的编码方式,即把解空间划分为 2^{17}-1 等份,然后通过一个17个bit的染色体来表达解空间的实数值。 确定好染色体形式之后,我们便可以拿它生成一个初始的种群。 进化迭代阶段 接下来会进行不停地进化迭代,每次迭代主要由三个阶段组成:选择、交叉、变异。 选择阶段。选择阶段经历了适应性选择和随机选择。在适应性选择中,我们通过适应性函数(fitness function)对种群中的每一条染色体进行适应性评估,按评估结果对染色体进行排序。筛选出适应性最好的一定数量(可以通过参数调节)的染色体,作为下一代的父母加入存货列表。而在随机选择中,我们会随机挑选一些没有通过适应性选择的个体也加入存活列表,这样做是为了使得一些拥有潜在价值基因但适应性很差的个体得以生存下来。 交叉阶段。每一代染色体的数量是一定的,我们淘汰了一部分染色体,就要生成新的染色体来补足空缺。从上一代中,我们保留了一部分存活的染色体,它们之间将会进行交叉。交叉是指随机从存活列表中抽取两个染色体,将这两条染色体进行融合从而生成新的染色体(就是取一部分父染色体的基因,再在母染色体取在父染色体没有取到的基因,把这些基因合成一条新的染色体),把新的染色体加入种群中。交叉操作会一直持续,直到种群数量跟之前的种群数量相同。 变异阶段。对于种群中的每一条染色体,使其一定几率地发生随机变异(在这个例子下就是反转染色体上某一个bit的值)。 验收阶段 经过很多代的进化之后,种群里面的染色体基本上符合最优化的要求了。这时就可以去对里面的染色体进行解码(decode),将其转化为实际的解。 python实现 代码写的挺渣的,不过标了很多注释。 #encoding=utf-8import mathimport randomimport operatorclass GA():    def __init__(self, length, count):        # 染色体长度        self.length = length        # 种群中的染色体数量        self.count = count        # 随机生成初始种群        self.population = self.gen_population(length, count)    def evolve(self, retain_rate=0.2, random_select_rate=0.5, mutation_rate=0.01):        \"\"\"        进化        对当前一代种群依次进行选择、交叉并生成新一代种群,然后对新一代种群进行变异        \"\"\"        parents = self.selection(retain_rate, random_select_rate)        self.crossover(parents)        self.mutation(mutation_rate)    def gen_chromosome(self, length):        \"\"\"        随机生成长度为length的染色体,每个基因的取值是0或1        这里用一个bit表示一个基因        \"\"\"        chromosome = 0        for i in xrange(length):            chromosome |= (1 << i) * random.randint(0, 1)        return chromosome    def gen_population(self, length, count):        \"\"\"        获取初始种群(一个含有count个长度为length的染色体的列表)        \"\"\"        return [self.gen_chromosome(length) for i in xrange(count)]    def fitness(self, chromosome):        \"\"\"        计算适应度,将染色体解码为0~9之间数字,代入函数计算        因为是求最大值,所以数值越大,适应度越高        \"\"\"        x = self.decode(chromosome)        return x + 10*math.sin(5*x) + 7*math.cos(4*x)    def selection(self, retain_rate, random_select_rate):        \"\"\"        选择        先对适应度从大到小排序,选出存活的染色体        再进行随机选择,选出适应度虽然小,但是幸存下来的个体        \"\"\"        # 对适应度从大到小进行排序        graded = [(self.fitness(chromosome), chromosome) for chromosome in self.population]        graded = [x[1] for x in sorted(graded, reverse=True)]        # 选出适应性强的染色体        retain_length = int(len(graded) * retain_rate)        parents = graded[:retain_length]        # 选出适应性不强,但是幸存的染色体        for chromosome in graded[retain_length:]:            if random.random() < random_select_rate:                parents.append(chromosome)        return parents    def crossover(self, parents):        \"\"\"        染色体的交叉、繁殖,生成新一代的种群        \"\"\"        # 新出生的孩子,最终会被加入存活下来的父母之中,形成新一代的种群。        children = []        # 需要繁殖的孩子的量        target_count = len(self.population) - len(parents)        # 开始根据需要的量进行繁殖        while len(children) < target_count:            male = random.randint(0, len(parents)-1)            female = random.randint(0, len(parents)-1)            if male != female:                # 随机选取交叉点                cross_pos = random.randint(0, self.length)                # 生成掩码,方便位操作                mask = 0                for i in xrange(cross_pos):                    mask |= (1 << i)                 male = parents[male]                female = parents[female]                # 孩子将获得父亲在交叉点前的基因和母亲在交叉点后(包括交叉点)的基因                child = ((male & mask) | (female & ~mask)) & ((1 << self.length) - 1)                children.append(child)        # 经过繁殖后,孩子和父母的数量与原始种群数量相等,在这里可以更新种群。        self.population = parents + children    def mutation(self, rate):        \"\"\"        变异        对种群中的所有个体,随机改变某个个体中的某个基因        \"\"\"        for i in xrange(len(self.population)):            if random.random() < rate:                j = random.randint(0, self.length-1)                self.population[i] ^= 1 << j    def decode(self, chromosome):        \"\"\"        解码染色体,将二进制转化为属于[0, 9]的实数        \"\"\"        return chromosome * 9.0 / (2**self.length-1)    def result(self):        \"\"\"        获得当前代的最优值,这里取的是函数取最大值时x的值。        \"\"\"        graded = [(self.fitness(chromosome), chromosome) for chromosome in self.population]        graded = [x[1] for x in sorted(graded, reverse=True)]        return ga.decode(graded[0])     if __name__ == '__main__':    # 染色体长度为17, 种群数量为300    ga = GA(17, 300)    # 200次进化迭代    for x in xrange(200):         ga.evolve()    print ga.result() 简陋的)运行结果,很接近 总结 遗传算法可以产出一组相对较优的解,而且不需要根据具体问题去进行过多的逻辑推演,速度也相对较快。缺点就是不能保证解是最优的。", "label": "1"}
      {"text": "实际软件工程中是否真的需要100%代码覆盖率(code coverage)? 实际项目中,项目经理和架构师往往也是不错的测试员,一些严重bug,经常是他们先发现,比测试员还快一点。 项目中有很多的function, 但function之间的重要性是不同的,也就是说,是不均匀的,有的重要,有的没那么重要,同样是80%的覆盖率,一个覆盖到最重要的function,另一个没有,最后的结果也是天差地别的。 和覆盖率相比,更重要的是测试的顺序,确保最常用,最重要,最核心的功能先测试到,有bug,先发现,先解决,这样测试才高效,团队也会越测越有信心。 这也需要测试员对项目和需求有更深入的理解。 覆盖率高,当然好,但工程类的东西往往需要妥协和平衡,时间不够时,先测什么,后测什么,就更重要一些了。", "label": "1"}
      //低质量:信息量低//口语化内容
      {"text": "有车是怎样的体验? 生活质量有提高。也有降低。 可以想去哪去哪,不开心就转一圈。 降低也有很多。刚毕业不久,工作原因买了个商务车。油耗保养什么的挤占你的工资。还有就是,朋友之间的,一个电话,你可能就要跑很久接送人,比较不开心。 最特么重要的是,当你看见莫名其妙的罚款单的时候。 索性没人认识。不打码了。答案千万别火啊。", "label": "0"}
      //……
      • Data to be cleaned
      //{"text": #input text, "label": 0/1, 0 for high quality, 1 indicating low quality}
      //低质量:赌博/诈骗/低俗色情//营销内容
      {"text": "“酒店招女/男公关”小广告的目的是什么? 帮我改了标题之后似乎把我的原意给模糊了,我是想问:小广告重点是想“招聘女职员”,还是想吸引男人注意去消费。 本人带队直招:(不收取任何形式的押金、进场费、管理费、介绍费等等)。我们客源多而稳定生意红火,绝对不会出现几天上不到班的情况,挣钱不是梦。每个做夜场的女孩都不想东奔西走的找场子,就算日新俩三千,三天打鱼两天晒网,到头来也赚不到什么钱。都想找一个能稳定的可以挣到钱的场子和一个好的领队。如果你们也是这样想的,那么就请相信我,我这里就是你们不二的选择,如果你犹豫了错过了,那就只能怪你们自己", "label": "0"}
      {"text": "如何通俗易懂地解释遗传算法?有什么例子? 大三软件工程学生,以前只听过遗传算法这个名字,但是真正是怎么一回事没有了解过。今天刚好看到  的回答,想起这学期正好选了人工智能这堂课,就觉得想试着码一下这个算法,算是提前预习一下。于是花了两个小时把这个算法大概搞懂了,把思路写一遍,也算是自己再熟悉一遍(如果哪里搞错了请大神们轻喷  理解这个算法首先要理解一些术语。下图(来自 Genetic Algorithms Fundamentals )把术语之间的关系表示的很清楚。 遗传算法就是通过不断地进化,将种群里面我们最想要的染色体保留下来。进化多次之后,种群里的大部分染色体都会是比较优势的染色体(我们想要的解),所以我们可以通过这个算法获取多个较优解。 ps: 关于基因和等位基因的区别:基因(gene)是指染色体上的特定位置,而等位基因(allele)则是当前染色体在该基因处的值。 知道一些术语之间的关系之后,可以试着尝试搞懂算法了。拿@sjyan刚刚这道题做例子。 求解函数 f(x) = x + 10*sin(5*x) + 7*cos(4*x) 在区间[0,9]的最大值。 用遗传算法解这道题的过程, 他说得很清楚,主要是三个阶段: 初始化阶段 确定染色体的形式。先选择一种方式对x进行编码,使其从实际的解空间(phenotype space)被映射到编码空间(genotype space),也就是把实数x变成一条染色体。在这道题中我沿用了@sjyan的编码方式,即把解空间划分为 2^{17}-1 等份,然后通过一个17个bit的染色体来表达解空间的实数值。 确定好染色体形式之后,我们便可以拿它生成一个初始的种群。 进化迭代阶段 接下来会进行不停地进化迭代,每次迭代主要由三个阶段组成:选择、交叉、变异。 选择阶段。选择阶段经历了适应性选择和随机选择。在适应性选择中,我们通过适应性函数(fitness function)对种群中的每一条染色体进行适应性评估,按评估结果对染色体进行排序。筛选出适应性最好的一定数量(可以通过参数调节)的染色体,作为下一代的父母加入存货列表。而在随机选择中,我们会随机挑选一些没有通过适应性选择的个体也加入存活列表,这样做是为了使得一些拥有潜在价值基因但适应性很差的个体得以生存下来。 交叉阶段。每一代染色体的数量是一定的,我们淘汰了一部分染色体,就要生成新的染色体来补足空缺。从上一代中,我们保留了一部分存活的染色体,它们之间将会进行交叉。交叉是指随机从存活列表中抽取两个染色体,将这两条染色体进行融合从而生成新的染色体(就是取一部分父染色体的基因,再在母染色体取在父染色体没有取到的基因,把这些基因合成一条新的染色体),把新的染色体加入种群中。交叉操作会一直持续,直到种群数量跟之前的种群数量相同。 变异阶段。对于种群中的每一条染色体,使其一定几率地发生随机变异(在这个例子下就是反转染色体上某一个bit的值)。 验收阶段 经过很多代的进化之后,种群里面的染色体基本上符合最优化的要求了。这时就可以去对里面的染色体进行解码(decode),将其转化为实际的解。 python实现 代码写的挺渣的,不过标了很多注释。 #encoding=utf-8import mathimport randomimport operatorclass GA():    def __init__(self, length, count):        # 染色体长度        self.length = length        # 种群中的染色体数量        self.count = count        # 随机生成初始种群        self.population = self.gen_population(length, count)    def evolve(self, retain_rate=0.2, random_select_rate=0.5, mutation_rate=0.01):        \"\"\"        进化        对当前一代种群依次进行选择、交叉并生成新一代种群,然后对新一代种群进行变异        \"\"\"        parents = self.selection(retain_rate, random_select_rate)        self.crossover(parents)        self.mutation(mutation_rate)    def gen_chromosome(self, length):        \"\"\"        随机生成长度为length的染色体,每个基因的取值是0或1        这里用一个bit表示一个基因        \"\"\"        chromosome = 0        for i in xrange(length):            chromosome |= (1 << i) * random.randint(0, 1)        return chromosome    def gen_population(self, length, count):        \"\"\"        获取初始种群(一个含有count个长度为length的染色体的列表)        \"\"\"        return [self.gen_chromosome(length) for i in xrange(count)]    def fitness(self, chromosome):        \"\"\"        计算适应度,将染色体解码为0~9之间数字,代入函数计算        因为是求最大值,所以数值越大,适应度越高        \"\"\"        x = self.decode(chromosome)        return x + 10*math.sin(5*x) + 7*math.cos(4*x)    def selection(self, retain_rate, random_select_rate):        \"\"\"        选择        先对适应度从大到小排序,选出存活的染色体        再进行随机选择,选出适应度虽然小,但是幸存下来的个体        \"\"\"        # 对适应度从大到小进行排序        graded = [(self.fitness(chromosome), chromosome) for chromosome in self.population]        graded = [x[1] for x in sorted(graded, reverse=True)]        # 选出适应性强的染色体        retain_length = int(len(graded) * retain_rate)        parents = graded[:retain_length]        # 选出适应性不强,但是幸存的染色体        for chromosome in graded[retain_length:]:            if random.random() < random_select_rate:                parents.append(chromosome)        return parents    def crossover(self, parents):        \"\"\"        染色体的交叉、繁殖,生成新一代的种群        \"\"\"        # 新出生的孩子,最终会被加入存活下来的父母之中,形成新一代的种群。        children = []        # 需要繁殖的孩子的量        target_count = len(self.population) - len(parents)        # 开始根据需要的量进行繁殖        while len(children) < target_count:            male = random.randint(0, len(parents)-1)            female = random.randint(0, len(parents)-1)            if male != female:                # 随机选取交叉点                cross_pos = random.randint(0, self.length)                # 生成掩码,方便位操作                mask = 0                for i in xrange(cross_pos):                    mask |= (1 << i)                 male = parents[male]                female = parents[female]                # 孩子将获得父亲在交叉点前的基因和母亲在交叉点后(包括交叉点)的基因                child = ((male & mask) | (female & ~mask)) & ((1 << self.length) - 1)                children.append(child)        # 经过繁殖后,孩子和父母的数量与原始种群数量相等,在这里可以更新种群。        self.population = parents + children    def mutation(self, rate):        \"\"\"        变异        对种群中的所有个体,随机改变某个个体中的某个基因        \"\"\"        for i in xrange(len(self.population)):            if random.random() < rate:                j = random.randint(0, self.length-1)                self.population[i] ^= 1 << j    def decode(self, chromosome):        \"\"\"        解码染色体,将二进制转化为属于[0, 9]的实数        \"\"\"        return chromosome * 9.0 / (2**self.length-1)    def result(self):        \"\"\"        获得当前代的最优值,这里取的是函数取最大值时x的值。        \"\"\"        graded = [(self.fitness(chromosome), chromosome) for chromosome in self.population]        graded = [x[1] for x in sorted(graded, reverse=True)]        return ga.decode(graded[0])     if __name__ == '__main__':    # 染色体长度为17, 种群数量为300    ga = GA(17, 300)    # 200次进化迭代    for x in xrange(200):         ga.evolve()    print ga.result() 简陋的)运行结果,很接近 总结 遗传算法可以产出一组相对较优的解,而且不需要根据具体问题去进行过多的逻辑推演,速度也相对较快。缺点就是不能保证解是最优的。", "label": "1"}
      {"text": "实际软件工程中是否真的需要100%代码覆盖率(code coverage)? 实际项目中,项目经理和架构师往往也是不错的测试员,一些严重bug,经常是他们先发现,比测试员还快一点。 项目中有很多的function, 但function之间的重要性是不同的,也就是说,是不均匀的,有的重要,有的没那么重要,同样是80%的覆盖率,一个覆盖到最重要的function,另一个没有,最后的结果也是天差地别的。 和覆盖率相比,更重要的是测试的顺序,确保最常用,最重要,最核心的功能先测试到,有bug,先发现,先解决,这样测试才高效,团队也会越测越有信心。 这也需要测试员对项目和需求有更深入的理解。 覆盖率高,当然好,但工程类的东西往往需要妥协和平衡,时间不够时,先测什么,后测什么,就更重要一些了。", "label": "1"}
      //低质量:信息量低//口语化内容
      {"text": "有车是怎样的体验? 生活质量有提高。也有降低。 可以想去哪去哪,不开心就转一圈。 降低也有很多。刚毕业不久,工作原因买了个商务车。油耗保养什么的挤占你的工资。还有就是,朋友之间的,一个电话,你可能就要跑很久接送人,比较不开心。 最特么重要的是,当你看见莫名其妙的罚款单的时候。 索性没人认识。不打码了。答案千万别火啊。", "label": "0"}
      //……
    • Output:

      • Cleaned Data
      // 'text': #input text , 'prob': probability of being low quality 
      {"id": 3330999, "text": "哪些毕业论文的「致谢」部分让你印象深刻? 致谢 时近仲夏,岁在乙未,梧桐树下,清风明月,闲庭信步,回思往事,处处感怀。余十有八入长大,今已七年有余,入校所植之树,今已蔚然成荫矣,叹七载寒窗仅须臾耳,余多可喜多有有憾。 喜者有二,曰路漫漫而有爱,曰上下求索而有得。 有爱者,曰养育恩,曰师生情,曰鹣鲽意,曰同窗谊。 吾跪而叩谢者一曰养育恩。吾本草芥寒门,得有今日之成,皆赖椿萱。家慈教子以严,温良恭俭,家严襟怀洒落,博学多才,尤擅属文。暌隔庭闱,瞬已数载,椿萱衰迈,松菊萧条,每念及兹,余心怆然,唯朝乾夕惕,以报得万一。 吾跪而叩谢者二曰师生情。初,余师从周仁老师,吾才薄识短,囿于章句之学,不谙处世之道,恩师言传身教,耳提面命。晨夕讲授,通宵达旦,不达则不休,必通彻乃已。吾师徒二人尝因公三昼夜不眠不休于兰,盖因推敲二字。余性散漫,恩师尝教之曰:“天下事,果能坚韧不懈,总有可志竟成。志之所向,金石为开,谁能御之?”初吾常思应酬周到,恩师常诲之曰:“大抵任事之人,断不能有毁而无誉,有恩而无怨,不求人人应酬,事事周到,但求问心无愧,知恩图报。”陶冶变化,余性亦有所改。恩师用心之深,用力之勤,无人可及,愿承欢膝下,竭吾之能,以孝恩师,以寸草之心报三春之晖。 吾师鲁师,实乃真学者也,学问精深,品格方正。吾毕业论文开题之际,恰鲁师赴美深造,然其心系学生,吾之论文承蒙鲁师反复开说,屡次跨洋与吾讲说至数刻之久,先生以苦口滴杜鹃之血,增删五次,六易吾稿。余初做学问,困心衡虑,不得其法,胸有千言,或笔下无字,或洋洋洒洒,不得要领,先生言之切切,微言大义,专从学理上用力,不厌其烦,听之,昭然若发蒙也。余之理法才气俱进,胸中之意,今可达腕下。余本才短又性浮嚣,好用小智小术,鲁师常诲之曰:“天下之至拙,能胜天下之至巧。读书立志,须以困勉之功,锱铢积累,则终可达,浮光掠影,终不济事。读书困时切莫放弃,熬过此关,便可少进,日日精进,自有通达之时。”又曰:“自古成名者,多由笨干,天下事,最怕认真二字,凡事认真,终得其报。”三度春秋,鱼渔双授,先生于此,一生永铭。 三曰鹣鲽意。吾爱志伟,伴我寒窗,容余任性,许吾安稳,乃吾铠甲亦吾软肋,路遥遥,愿与君偕行。 四曰同窗谊。竹马之交霍然,共战人生数役,同享生活之乐,互为莫逆,情同手足;友迪,与交七载,相与分忧,互为解难,受益匪浅;友村,居住同室,切磋学艺,同窗情深;友恒大,胸怀锦绣,虽为新交亦引为知己;师兄张宏东、任玉龙、师姐海兰于吾亦有垂教之恩。得友如斯,幸甚至哉。 恩长笔短,吾之述不足以表其万一,寥寥数笔,仅余区区之意也。 有得者,曰知研究之真味,曰体求知之乐趣。书山浩浩,学海淼淼,今有寸得,如沧海一粟,余者吾将毕生求索。 憾者有二, 曰制之无节,曰行之无恒。此二者吾之所短也,余亦深以此自愧。时忆求学事,本因用功之时,常常玩偈,致百不遂志,精神散漫,愧悔憧扰,不能摆脱。人生之大憾非不能也,盖本可以也。语不云乎:往者不可谏,来者犹可追。自今以始,吾必不得自逸,使恒心常在。 伤离别,具表文,余心惶惶然。愿师长安康,同窗如意,再拜稽首。 乙未仲夏于博士楼","meta": {"Prob":0.04515477493841735}}
      {"id": 15134791, "text": "都说俄语难,请问俄语究竟难在什么地方? 字母发音这些请勿赘述,因为我觉得凡是打算学一门语言的人总会对这些有心理准备。我想了解俄语语法和词汇方面的难点。还有词源什么的。如果可以的话请对照着中文和英文这两种一般人有了解的语言来说明。 没想到这么多赞同,过来继续补充一些 ======================================= 俄语小本来凑热闹,学得不精,只是少有看到和自己语言有关的忍不住。 如果初学的话,最先接触的肯定是 1 名词性数格  这些在英文中是不存在的,但是很多印欧语系的语言中都有,所以并不特殊,只能说英语极度简化了。名词有3个性,单复数,6个格。 2 动词变位  动词有六个变位,按我们老师的话说,俄语的动词原形其实记了没啥用的,基本用不着。这话夸张了,但可以想见,大多数时候看到的俄语动词都是变位形式,有的特殊变位甚至让你无法推断其原形,而且你在说每句话的时候动词不能够脱口而出,要先在脑子里根据主语及时态给它变位,所以初期很容易说得磕磕巴巴的。其实简单地说动词变位是不准确的,很多人只看到动词的六个变位,事实上这个只要背下来常运用总会熟练的,动词的复杂程度远远不止于此。俄语的动词十分发达,最好的体现在动词前缀上。前缀类型有几十种。同样的词源,加不同的前缀意思就完全不同,甚至南辕北辙,而同样一个动词本身的意思也极其复杂,我总觉得比英语复杂,一个动词有本义引申义经常不少于10种,太常见了,总是容易弄混。 3 上述都算是语法吧,包括 形动词、副动词、无人称句 等等,都是其他语言不存在的语言现象(经知友 提醒西班牙语有副动词,更正),需要一阵的理解钻研,但语法这种东西,一旦理解了就可以举一反三,其实并不是高不可攀的。( 这里补充一点无人称句,为什么列出来,因为我们最熟悉的外语——英语中不存在无人称句。英语有It is raining. 这种句子,中文翻译或者隐含意是“天气”,天下雨了,英文中也是有个形式主语it的,即使没有真正主语,英文中一定有个形式主语,可俄语的无人称句连形式主语都没有,就是没有主语。比如下雨了,“下”这个词会是动词,“雨”变成宾语,没有任何主语。 初学者肯定容易不好理解,但都是可以攻克的难关,像前面说的,一旦懂了就是懂了。) 4  还有许多“ 习惯 ”问题。语言这东西很玄妙。总的说来就是“我们习惯这么说而不那么说”。比如用词。词义辨析是很大一块冰山。同样意思的词有五六个,他们可以是语体的区别(公文语体、官方语、口语等),可以使表达情绪的强烈不同,可以是语境不同、可以是不同的内涵和外延。在这里举个例加强理解: 俄语中常用的“有助于”有三个 (只是常用),这三个要这么区分: 一个是正式语体中用,一个是你全权帮助协助(比如你帮助妹妹学习),一个是你的帮助是一部分因素,比如好的天气有助于运动会的开展。以上不可以混用。这么一看英语的help是不是太可爱了! (这个例子是才接触过所以有印象,其实不算什么,远远不能体现俄语的变态……)总之区别或大或小,你都要记,用错了词,即使意思一样,听起来也很奇怪,会让俄罗斯人不理解。 这个话题说起来太大了,包括文化问题映射在语言上等,先写这么多,有空再来更。  =================================== 应 来补充 感谢各位赞同~ 5  俄罗斯的语气词也很让人头疼。当然如果只是想粗略地学,仅仅和人交流的层面,语气词学不通无伤大雅,大不了不用么!只不过你不会用语气词,你跟人讲话、发邮件就好像是新闻联播一样,这些“小词儿”,数量多,但最关键的是一个词有很多种语气……像же、уж之类,不同语境下意思迥异,尤其在读文学作品,在揣摩和你对话的人的言下之意(比如我只考了80分和我考了80分呢 前者你要安慰后者你要恭喜 搞错了可咋整)上用处极大不可大意。 6  还能想到的俄语比中文发达的一个类别是 情绪、表情 。很多词甚至没有办法找到相应的中文对应。而且中文有一点很好,就是它的“ 上位词 ”很发达。比如说 小说统称为小说,讲起来很方便,不管你写的哪类,总归是小说,我不会说错。但俄语中没有“小说”这个词,只有长篇小说,中篇小说,短篇小说,科幻小说,爱情小说等等……说之前必须要了解才能张口。否则就会犯“前两天看了短篇小说《安娜卡列尼娜》”这种错误,一定要背清楚啊不然会被鄙视死…… 类似的情况不胜枚举,由于没有上位词,俄语的表达难度无形中增加,但是也更准确了。说上位词的原因是,比如在情绪一类,中国有喜怒哀乐,由于上位词的发达(其实这里这么用未必合适,但为了方便起见),喜都是喜:惊喜、狂喜、窃喜,怒都是怒:暴怒、狂怒、怨怒,一看就很好理解。而俄语中这些词都是不一样的,就是长得区别很大!当然外语很多都是这样。比如“惊讶”吧,俄语常用的有6个,长得完全不一样,程度递增,翻译就是: 略惊讶,稍惊讶,很惊讶,特别惊讶,惊讶死了,震惊啊啊啊! 其中第二个惊讶只能用于好事,第六个惊讶只能用于坏事。你都要背下来,不可以乱用。 7 语序  这也算是“习惯”一类吧。你们知道,由于有性数格,所以俄语中的语序没有英文中文那么重要。比如“我打你”“你打我”在中文不一样,顺序可不能乱,但在俄语中就无所谓,因为被打的那个人是变格的,所以谁被打一目了然,你想把谁放在前面都可以。当然语序可不只是这么简单,除了说话时要把 新信息放在最后 , 状语一般放两边 等等这些最基础的,正是由于俄语的语序不影响语法状态,怎么说都行,你就更不能“怎么说都行”,句子一旦长了,怎样编排他们的顺序就很有讲究,顺序说错了会给人一种“话没说完”或者别别扭扭的感觉,这个是长期训练出来的语感,没什么规律,就是多读多说。 文化这方面就极其庞杂了,而又极其重要。俄罗斯文学高度发展,几乎每个人都会背几首普希金叶赛宁的诗,要学俄语这些都是必须。人家经常说着说着“我们的诗人那曾经忧郁的眼神!”,那是说普希金呢;“像塔尼娅一样纯真的爱恋!”那是说《叶甫盖尼奥涅金》呢。跟英国人说啥都喜欢引圣经一个道理。当然俄罗斯文学不止普希金,他们的教育普及程度很高,人们说话喜欢引经据典,尤喜诗歌,所以基础的要知道。 俄罗斯也是一个十分有“传统”的国家,像中国一样。人们说话喜欢引用谚语俗语,而且谚语俗语很大程度上体现这个国家的一些精神。比如俄罗斯对“家国”的热爱,对“入侵”的反感,对“朋友”的珍视,都可以在谚语上体现出来,如果学俄语的话是一定要背的。 比如有句谚语:“ 不请自来的客人比鞑靼人还恶劣 !”(参见俄历史上蒙古鞑靼人入侵并统治240年) 他们喜欢熊,所以就有“ 熊在森林就好比主人在家 ”,认为熊聪明敏锐,守护家园,且憨态可掬。(熊真的对俄罗斯人十分重要,他们喜欢熊就像我们见到大熊猫就叫“好萌”是一个道理) 包括苏联那段历史,他们也会经常调侃,相关的谚语和俗语也很多。 先写这么多,吃饭去了。 =================================== 应  来补充,关于词源,没有具体研究过,还是请专业人士再细述一下吧。 据我所知的,俄语是 源于古斯拉夫语,尤其是东斯拉夫语 ,后来是教会斯拉夫语,规范了一部分古俄语,但那时候的俄语语法混乱,用词不准,真正 从普希金开始 ,是由他规范了“ 现代俄罗斯标准语 ”这也基本上是现在的俄语。 跟德语的渊源应该没有那么大的,当然印欧语系互相之间自然都有千丝万缕的联系,但就我所知对俄语的影响来说,德语肯定排不上。 希腊语倒是有联系的。俄语字母最开始的起源是 基里尔字母 ,就是来源于希腊语字母。 英语的影响如今确实越来越大了, 英语词汇入侵得厉害 ,不仅一些新兴词汇大多用英语代替,就连一些原本俄语用的,也弃之不用,用比较大众化的英语词汇。比如“志愿者”,俄语现在常用的волентёр就是根据volunteer变化而来,读音也差不多。现在这种词极多,已经蔓延在了各个领域。多出现在新兴事物上。但事实上,俄语本身有很多词的读音和英语就很像的——学小语种的人应该都有体会——这倒不全是英语的影响,只是英语和欧洲许多语言系出同源,这里不一定是互相影响。 Современные лексические и грамматические черты русского языка — результат длительного взаимодействия различных восточнославянских диалектов, распространённых на великорусской территории, и церковнославянского языка, возникшего в результате адаптации на русской почве языка первых христианских книг IX—XI вв. («старославянского языка»). 以上是维基百科的俄文版,大意是说:现代的俄语口语及书面语基本上是东斯拉夫语各地方言相互作用的结果,以及9~11世纪第一批教会书籍中对古俄语做了部分调整的教会斯拉夫语。 即是说,希腊语、东斯拉夫语、宗教(东正教)用语,都对俄语的形成产生影响。只是那些很古老了,许多用词也都已经被抛弃,如今的标准语是从普希金开始规范的。 我的所知基本就这些了,剩下等更专业的人来解答吧。", "meta": {"Prob":0.38267436731076065}}
      {"id": 92661, "text": "你去过的哪些博物馆特别吸引你? 初步浏览了大神们的答案,我就简单阐述一下我去过的四个国内博物馆,上海博物馆、国家博物馆、南京博物院和苏州博物馆。 上海博物馆让我最震撼的是青铜器和字画,尤其是青铜器,基本上把每个青铜器都拍了下来。最喜欢的青铜器是编钟,就安静的陈列在那里,想到千年前有人敲响它,演奏着古朴的旋律,久久不想离开。在上博你可以看到唐寅、文征明的字画,那是用毛笔在宣纸上勾勒出的水墨线条。对了上博还有许多精美的瓷器,玉器,绝对值得一去。 国家博物馆,设计风格独特,在每个馆外也有展品。每个展馆不大,东西没有上博多。个人觉得国家博物馆最大的特色就是有许多国外展厅,包括非洲,俄罗斯,还有各国赠与中国领导人的纪念品。 南京博物院,印象不深,去的那天下雨,展品也很丰富,但是基本没印象了。印象最深的是有一条“仿古街”,还原了大概民国时的街道。南京博物院有个科技展区还挺好玩的。 苏州博物馆,值得一看的是场馆设计,藏品在看完上博后就没什么意思啦。不过离拙政园很近,可以顺便去看看。", "meta": {"Prob":0.31295625980305586}}
      • Excluded Data
      // 'text': #input text , 'prob': probability of being low quality 
      {"id": 904009, "text": "如何正确看待三生三世十里桃花电视剧打击盗版?首先,三生三世十里桃花这部剧说打击盗版这个行为是正确的,维护自己的版权。但是三生三世十里桃花是抄袭网络某耽美作者的啊,所以说抄耽就不算抄袭?原谅贫道孤陋寡闻,本身就是抄袭的现在你在这里告诉我你要打击盗版?!完全就是贼喊捉贼吧,哈哈哈哈哈哈这笑话我能笑一年听说现在要出电影了?和华胥引一起?希望不会撞车哈哈哈哈哈哈", "type": "qa", "source_dataset": "wg_batch2_zhihu", "title": "", "meta": {"prob": 0.8741011765270877}}
      {"id": 904011, "text": "怎么样证明自己不是渣男?娶她。","meta": {"prob": 0.5239115483615828}}
    • Classfier: Bag-of-Words-based Ridge Classifier

      • Bag-of-Words: Each word in the text is represented as a one-hot encoded vector.
      • Ridge Classifier: A Logistic Classifier with an L2 Norm, which uses L2 regularization to constrain the size of the model's regression coefficients, thereby enhancing the model's generalization ability and stability in a linear classification model.