3000篇搜狐新闻语料数据预处理器的python实现

白宁超

2017年5月5日17:20:04

摘要: 关于自然语言处理模型训练亦或是数据挖掘、文本处理等等,均离不开数据清洗,数据预处理的工作。这里的数据不仅仅指狭义上的文本数据,当然也包括视频数据、语音数据、图片数据、监控的流数据等等。其中数据预处理也有必要强调下,决然不是简单是分词工具处理后,去去停用词那么简单。即使去停用词,你选择的粒度尺寸也是有影响的,这跟工作性质和精确度要求也有着紧密的联系。其次选择多大的规模以及怎样维度都是有讲究的。本文由于主要针对新闻文本语料处理,经处理后可用于文本分类、文本聚类、特征提取、文本摘要等学习模型的训练。首先本文介绍下新闻语料的文本信息和编码问题;其次,对本实验运行的环境进行简单介绍,以及整个预处理器的框架构造;接着对单文本和批量文本的预处理工作的原理和实现介绍;还有对python如何调用java程序也通过实例进行演示。最后,对jieba分词工具的主要实现进行补充。本人邮箱:datathinks@qq.com,主页:http://www.cnblogs.com/baiboy/(本文原创,转载请标注原文出处:3000篇搜狐新闻语料数据预处理器的python实现 )

1 搜狐新闻语料获取和编码规范


简介:本文训练的新闻语料是从搜狐官网下载的10类3000篇新闻真实语料,具体如下图,其中每类下面是300篇新闻文章。其中:C000007 汽车,C000008 财经,C000010 IT,C000013 健康,C000014 体育,C000016 旅游,C000020 教育,C000022 招聘,C000023 文化,C000024 军事

这个语料开始不能使用,主要是编码问题。如果少量尚可以采用Notepad++进行编码转换,如此的文本量手动就那么费时费力,更不必说更大规模语料了。故而本文采用批量格式转码器进行处理【BatUTF8Conv,读者可以自行下载】。本文的10类3000篇新闻语料共计16.4M,经过编码处理后,读者可以到:【链接: https://pan.baidu.com/s/1jIJrGKu 密码: kksp】下载使用即可

2 开发环境和程序结构介绍


开发环境

本文使用的开发环境是sublime Text +anaconda集成的运行环境,其中(1)如果使用结巴分词,需要下载结巴分词并在本地安装.(2)如果使用hanLp,需要下载jar和hanLP进行安装并配置。

具体配置读者可以参照:【Python开发工具:Anaconda+Sublime】一文进行配置

标记1:经过编码处理后的新闻语料数据

标记2:经过分词等预处理后的熟语料数据

标记3:分别是1892字的中文停用词表、891字的英文停用词表、哈工大的767字的中文停用词表(下载链接: https://pan.baidu.com/s/1c1QFpcs 密码: zsek)

标记4:自定义词典

标记5:中文预处理程序和相关分词工具代码展示

3 单个文件的预处理


3.1 测试单个文件原路径和保存路径及停用词路径

# 测试单个文件dealpath="../Database/SogouC/FileTest/1.txt"savepath="../Database/SogouCCut/FileTest/1.txt"stopwordspath='../Database/stopwords/CH_stopWords.txt'

查看下测试文件如下:

测试处理结果:

3.2 加载自定义结巴词典

sys.path.append("../")
jieba.load_userdict("../Database/userdict.txt") # 加载自定义分词词典

3.3 单文本处理主函数介绍

'''
分词.词性标注以及去停用词
stopwordspath: 停用词路径
dealpath:中文数据预处理文件的路径
savepath:中文数据预处理结果的保存路径
'''
def cutTxtWord(dealpath,savepath,stopwordspath):stopwords = {}.fromkeys([ line.rstrip() for line in open(stopwordspath,"r",encoding='utf-8')]) # 停用词表with open(dealpath,"r",encoding='utf-8') as f:txtlist=f.read() # 读取待处理的文本words =pseg.cut(txtlist) # 带词性标注的分词结果cutresult=""# 获取去除停用词后的分词结果for word, flag in words:if word not in stopwords:cutresult += word+"/"+flag+" " #去停用词getFlag(cutresult,savepath) #

4 批量文件的预处理

语料预处理器的核心:目的是通过用户传输预处理文本文件夹即可,其后面的所有子文件夹自动处理,且将处理结果单独按照原语料结构格式进行归一化保存。这里面涉及几个问题:(1)支持停用词的处理;(2)采用结巴分词,支持自定义词典和词语合并拆分功能;(3)支持词性筛选;(4)支持标准化规约化语料集的形成

随机查看批量预处理中C000024 军事的0.txt文件

处理后的结果:

4.1 批量处理文件路径

if __name__ == '__main__' :t1=time.time()stopwordspath='../Database/stopwords/CH_stopWords.txt'# 批量处理文件夹下的文件rfolder_path = '../Database/SogouC/FileNews/'# 分词处理后保存根路径wfolder_path = '../Database/SogouCCut/'# 中文语料预处理器cutFileWord(rfolder_path,wfolder_path,stopwordspath) # 多文本预处理器t2=time.time()print("中文语料语处理完成,耗时:"+str(t2-t1)+"秒。") #反馈结果

4.2 分词.词性标注以及去停用词

'''
分词.词性标注以及去停用词
stopwordspath: 停用词路径
read_folder_path :中文数据预处理文件的路径
write_folder_path :中文数据预处理结果的保存路径
filescount=300 #设置文件夹下文件最多多少个
'''def cutFileWord(read_folder_path,write_folder_path,stopwordspath):# 停用词表stopwords = {}.fromkeys([ line.rstrip() for line in open(stopwordspath,"r",encoding='utf-8')])# 获取待处理根目录下的所有类别folder_list = os.listdir(read_folder_path)# 类间循环for folder in folder_list:#某类下的路径new_folder_path = os.path.join(read_folder_path, folder)# 创建保存文件目录path=write_folder_path+folder #保存文件的子文件isExists=os.path.exists(path)if not isExists:os.makedirs(path)print(path+' 创建成功')else: passsave_folder_path = os.path.join(write_folder_path, folder)#某类下的保存路径print('--> 请稍等,正在处理中...')# 类内循环files = os.listdir(new_folder_path)j = 1for file in files:if j > len(files): breakdealpath = os.path.join(new_folder_path, file) #处理单个文件的路径with open(dealpath,"r",encoding='utf-8') as f:txtlist=f.read()# python 过滤中文、英文标点特殊符号# txtlist1 = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+", "",txtlist)words =pseg.cut(txtlist) # 带词性标注的分词结果cutresult="" # 单个文本:分词后经停用词处理后的结果for word, flag in words:if word not in stopwords:cutresult += word+"/"+flag+" " #去停用词savepath = os.path.join(save_folder_path,file)getFlag(cutresult,savepath)j += 1

其中:

1) # 停用词表: stopwords = {}.fromkeys([ line.rstrip() for line in open(stopwordspath,"r",encoding='utf-8')])

此格式将文本列表进行字典化处理,具体查看fromkeys()方法的使用

2)# 获取根目录下的子文件夹集合: folder_list = os.listdir(read_folder_path)

3)#某类(子文件夹)下的所有文件:new_folder_path = os.path.join(read_folder_path, folder)

4)#创建文件:  

# 创建保存文件目录path=write_folder_path+folder #保存文件的子文件isExists=os.path.exists(path)if not isExists:os.makedirs(path)print(path+' 创建成功')else: pass

5) # python 过滤中文、英文标点特殊符号: txtlist1 = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+", "",txtlist)

6)过滤停用词:

for word, flag in words:if word not in stopwords:cutresult += word+"/"+flag+" " #去停用词

4.3 词性筛选

'''
做词性筛选
cutresult:str类型,初切分的结果
savepath: 保存文件路径
'''
def getFlag(cutresult,savepath):txtlist=[] #过滤掉的词性后的结果#词列表为自己定义要过滤掉的词性cixing=["/x","/zg","/uj","/ul","/e","/d","/uz","/y"]for line in cutresult.split('\n'):line_list2=re.split('[ ]', line)line_list2.append("\n") # 保持原段落格式存在line_list=line_list2[:]for segs in line_list2:for K in cixing:if K in segs:line_list.remove(segs)breakelse:passtxtlist.extend(line_list)# 去除词性标签resultlist=txtlist[:]flagresult=""for v in txtlist:if "/" in v:slope=v.index("/")letter=v[0:slope]+" "flagresult+= letterelse:flagresult+= vstanddata(flagresult,savepath)

其中:词性问题参加结巴分词官网文档

4.4  标准化处理

'''
标准化处理,去除空行,空白字符等。
flagresult:筛选过的结果
'''
def standdata(flagresult,savepath):f2=open(savepath,"w",encoding='utf-8')for line in flagresult.split('\n'):if len(line)>=2:line_clean="/ ".join(line.split())lines=line_clean+" "+"\n"f2.write(lines)else: passf2.close()

5 python调用java实现的HanLP工具


1 安装jar包,并通过查看其是否安装配置成功。(此处环境变量配置省略)

java命令

javac命令

2 在c盘下创建hanlp文件下,并将下面的hanlp.jar包下载复制到hanlp文件夹下:

链接: https://pan.baidu.com/s/1qYmB0XQ 密码: hz9v

 

3) 启动java虚拟机

startJVM(getDefaultJVMPath(), "-Djava.class.path=C:\hanlp\hanlp-1.3.2.jar;C:\hanlp", "-Xms1g", "-Xmx1g") # 启动JVM,Linux需替换分号;为冒号:

4)具体代码和执行结果如下:

# -*- coding:utf-8 -*-
# Filename: main.pyfrom jpype import *startJVM(getDefaultJVMPath(), "-Djava.class.path=C:\hanlp\hanlp-1.3.2.jar;C:\hanlp", "-Xms1g", "-Xmx1g") # 启动JVM,Linux需替换分号;为冒号:print("="*30+"HanLP分词"+"="*30)
HanLP = JClass('com.hankcs.hanlp.HanLP')
# 中文分词
print(HanLP.segment('你好,欢迎在Python中调用HanLP的API'))
print("-"*70)print("="*30+"标准分词"+"="*30)
StandardTokenizer = JClass('com.hankcs.hanlp.tokenizer.StandardTokenizer')
print(StandardTokenizer.segment('你好,欢迎在Python中调用HanLP的API'))
print("-"*70)# NLP分词NLPTokenizer会执行全部命名实体识别和词性标注
print("="*30+"NLP分词"+"="*30)
NLPTokenizer = JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer')
print(NLPTokenizer.segment('中国科学院计算技术研究所的宗成庆教授正在教授自然语言处理课程'))
print("-"*70)print("="*30+"索引分词"+"="*30)
IndexTokenizer = JClass('com.hankcs.hanlp.tokenizer.IndexTokenizer')
termList= IndexTokenizer.segment("主副食品");
for term in termList :print(str(term) + " [" + str(term.offset) + ":" + str(term.offset + len(term.word)) + "]")
print("-"*70)print("="*30+" N-最短路径分词"+"="*30)
# CRFSegment = JClass('com.hankcs.hanlp.seg.CRF.CRFSegment')
# segment=CRFSegment()
# testCase ="今天,刘志军案的关键人物,山西女商人丁书苗在市二中院出庭受审。"
# print(segment.seg("你看过穆赫兰道吗"))
print("-"*70)print("="*30+" CRF分词"+"="*30)
print("-"*70)print("="*30+" 极速词典分词"+"="*30)
SpeedTokenizer = JClass('com.hankcs.hanlp.tokenizer.SpeedTokenizer')
print(NLPTokenizer.segment('江西鄱阳湖干枯,中国最大淡水湖变成大草原'))
print("-"*70)print("="*30+" 自定义分词"+"="*30)
CustomDictionary = JClass('com.hankcs.hanlp.dictionary.CustomDictionary')
CustomDictionary.add('攻城狮')
CustomDictionary.add('单身狗')
HanLP = JClass('com.hankcs.hanlp.HanLP')
print(HanLP.segment('攻城狮逆袭单身狗,迎娶白富美,走上人生巅峰'))
print("-"*70)print("="*20+"命名实体识别与词性标注"+"="*30)
NLPTokenizer = JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer')
print(NLPTokenizer.segment('中国科学院计算技术研究所的宗成庆教授正在教授自然语言处理课程'))
print("-"*70)document = "水利部水资源司司长陈明忠9月29日在国务院新闻办举行的新闻发布会上透露," \"根据刚刚完成了水资源管理制度的考核,有部分省接近了红线的指标," \"有部分省超过红线的指标。对一些超过红线的地方,陈明忠表示,对一些取用水项目进行区域的限批," \"严格地进行水资源论证和取水许可的批准。"
print("="*30+"关键词提取"+"="*30)
print(HanLP.extractKeyword(document, 8))
print("-"*70)print("="*30+"自动摘要"+"="*30)
print(HanLP.extractSummary(document, 3))
print("-"*70)# print("="*30+"地名识别"+"="*30)
# HanLP = JClass('com.hankcs.hanlp.HanLP')
# segment = HanLP.newSegment().enablePlaceRecognize(true)
# testCase=["武胜县新学乡政府大楼门前锣鼓喧天",
#         "蓝翔给宁夏固原市彭阳县红河镇黑牛沟村捐赠了挖掘机"]
# for sentence in testCase :
#   print(HanLP.segment(sentence))
# print("-"*70)# print("="*30+"依存句法分析"+"="*30)
# print(HanLP.parseDependency("徐先生还具体帮助他确定了把画雄鹰、松鼠和麻雀作为主攻目标。"))
# print("-"*70)text =r"算法工程师\n 算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法工程师就是利用算法处理事物的人。\n \n 1职位简介\n 算法工程师是一个非常高端的职位;\n 专业要求:计算机、电子、通信、数学等相关专业;\n 学历要求:本科及其以上的学历,大多数是硕士学历及其以上;\n 语言要求:英语要求是熟练,基本上能阅读国外专业书刊;\n 必须掌握计算机相关知识,熟练使用仿真工具MATLAB等,必须会一门编程语言。\n\n2研究方向\n 视频算法工程师、图像处理算法工程师、音频算法工程师 通信基带算法工程师\n \n 3目前国内外状况\n 目前国内从事算法研究的工程师不少,但是高级算法工程师却很少,是一个非常紧缺的专业工程师。算法工程师根据研究领域来分主要有音频/视频算法处理、图像技术方面的二维信息算法处理和通信物理层、雷达信号处理、生物医学信号处理等领域的一维信息算法处理。\n 在计算机音视频和图形图像技术等二维信息算法处理方面目前比较先进的视频处理算法:机器视觉成为此类算法研究的核心;另外还有2D转3D算法(2D-to-3D conversion),去隔行算法(de-interlacing),运动估计运动补偿算法(Motion estimation/Motion Compensation),去噪算法(Noise Reduction),缩放算法(scaling),锐化处理算法(Sharpness),超分辨率算法(Super Resolution),手势识别(gesture recognition),人脸识别(face recognition)。\n 在通信物理层等一维信息领域目前常用的算法:无线领域的RRM、RTT,传送领域的调制解调、信道均衡、信号检测、网络优化、信号分解等。\n 另外数据挖掘、互联网搜索算法也成为当今的热门方向。\n"
print("="*30+"短语提取"+"="*30)print(HanLP.extractPhrase(text, 10))
print("-"*70)shutdownJVM()

执行结果:

6 总结

新闻语料数据预处理器的python源码

#coding=utf-8
import os
import jieba
import sys
import re
import time
import jieba.posseg as psegsys.path.append("../")
jieba.load_userdict("../Database/userdict.txt") # 加载自定义分词词典'''
title:利用结巴分词进行文本语料处理:单文本处理器、批量文件处理器1 首先对文本进行遍历查找2 创建原始文本的保存结构3 对原文本进行结巴分词和停用词处理4 对预处理结果进行标准化格式,并保存原文件结构路径
author:白宁超
myblog:http://www.cnblogs.com/baiboy/
time:2017年4月28日10:03:09
''''''
分词.词性标注以及去停用词
stopwordspath: 停用词路径
dealpath:中文数据预处理文件的路径
savepath:中文数据预处理结果的保存路径
'''
def cutTxtWord(dealpath,savepath,stopwordspath):stopwords = {}.fromkeys([ line.rstrip() for line in open(stopwordspath,"r",encoding='utf-8')]) # 停用词表with open(dealpath,"r",encoding='utf-8') as f:txtlist=f.read() # 读取待处理的文本words =pseg.cut(txtlist) # 带词性标注的分词结果cutresult=""# 获取去除停用词后的分词结果for word, flag in words:if word not in stopwords:cutresult += word+"/"+flag+" " #去停用词getFlag(cutresult,savepath) #'''
分词.词性标注以及去停用词
stopwordspath: 停用词路径
read_folder_path :中文数据预处理文件的路径
write_folder_path :中文数据预处理结果的保存路径
filescount=300 #设置文件夹下文件最多多少个
'''def cutFileWord(read_folder_path,write_folder_path,stopwordspath):# 停用词表stopwords = {}.fromkeys([ line.rstrip() for line in open(stopwordspath,"r",encoding='utf-8')])# 获取待处理根目录下的所有类别folder_list = os.listdir(read_folder_path)# 类间循环for folder in folder_list:#某类下的路径new_folder_path = os.path.join(read_folder_path, folder)# 创建保存文件目录path=write_folder_path+folder #保存文件的子文件isExists=os.path.exists(path)if not isExists:os.makedirs(path)print(path+' 创建成功')else: passsave_folder_path = os.path.join(write_folder_path, folder)#某类下的保存路径print('--> 请稍等,正在处理中...')# 类内循环files = os.listdir(new_folder_path)j = 1for file in files:if j > len(files): breakdealpath = os.path.join(new_folder_path, file) #处理单个文件的路径with open(dealpath,"r",encoding='utf-8') as f:txtlist=f.read()# python 过滤中文、英文标点特殊符号# txtlist1 = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+", "",txtlist)words =pseg.cut(txtlist) # 带词性标注的分词结果cutresult="" # 单个文本:分词后经停用词处理后的结果for word, flag in words:if word not in stopwords:cutresult += word+"/"+flag+" " #去停用词savepath = os.path.join(save_folder_path,file)getFlag(cutresult,savepath)j += 1'''
做词性筛选
cutresult:str类型,初切分的结果
savepath: 保存文件路径
'''
def getFlag(cutresult,savepath):txtlist=[] #过滤掉的词性后的结果#词列表为自己定义要过滤掉的词性cixing=["/x","/zg","/uj","/ul","/e","/d","/uz","/y"]for line in cutresult.split('\n'):line_list2=re.split('[ ]', line)line_list2.append("\n") # 保持原段落格式存在line_list=line_list2[:]for segs in line_list2:for K in cixing:if K in segs:line_list.remove(segs)breakelse:passtxtlist.extend(line_list)# 去除词性标签resultlist=txtlist[:]flagresult=""for v in txtlist:if "/" in v:slope=v.index("/")letter=v[0:slope]+" "flagresult+= letterelse:flagresult+= vstanddata(flagresult,savepath)'''
标准化处理,去除空行,空白字符等。
flagresult:筛选过的结果
'''
def standdata(flagresult,savepath):f2=open(savepath,"w",encoding='utf-8')for line in flagresult.split('\n'):if len(line)>=2:line_clean="/ ".join(line.split())lines=line_clean+" "+"\n"f2.write(lines)else: passf2.close()if __name__ == '__main__' :t1=time.time()# 测试单个文件dealpath="../Database/SogouC/FileTest/1.txt"savepath="../Database/SogouCCut/FileTest/1.txt"stopwordspath='../Database/stopwords/CH_stopWords.txt'stopwordspath1='../Database/stopwords/HG_stopWords.txt' # 哈工大停用词表# 批量处理文件夹下的文件# rfolder_path = '../Database/SogouC/Sample/'rfolder_path = '../Database/SogouC/FileNews/'# 分词处理后保存根路径wfolder_path = '../Database/SogouCCut/'# 中文语料预处理器# cutTxtWord(dealpath,savepath,stopwordspath) # 单文本预处理器cutFileWord(rfolder_path,wfolder_path,stopwordspath) # 多文本预处理器t2=time.time()print("中文语料语处理完成,耗时:"+str(t2-t1)+"秒。") #反馈结果

本文核心代码如上所示,直接调用源程序就可完成基本的数据清洗工作操作,重用性较高,可以自定义扩展分词,也可以自定义过滤词性。

转载于:https://my.oschina.net/u/3579120/blog/1539095

【NLP】3000篇搜狐新闻语料数据预处理器的python实现相关推荐

  1. 【数据挖掘实验】利用朴素贝叶斯方法对百万搜狐新闻文本数据进行分类

    一.概述 本实验做的是一个很常见的数据挖掘任务:新闻文本分类. 语料库来自于搜狗实验室2008年和2012年的搜狐新闻数据, 下载地址:https://www.sogou.com/labs/resou ...

  2. 搜狐新闻文本分类:机器学习大乱斗

    目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处理过程与结果差别 工具 深度学习:keras 传统机器学习:sklear ...

  3. 利用朴素贝叶斯分类算法对搜狐新闻进行分类(python)

    数据来源  https://www.sogou.com/labs/resource/cs.php 介绍:来自搜狐新闻2012年6月-7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据,提供UR ...

  4. python新闻爬虫教程_python简易爬虫教程--(一)批量获取搜狐新闻

    我们先从简单的抓取文本信息开始,来写我们的第一个爬虫程序,获取搜狐新闻的内容. 我们首先来介绍一下我们需要用到的库. 爬虫程序的步骤,一般可以分为三步: 1.获取网页源码(html源码): 2.从代码 ...

  5. AI赋能新闻播报 搜狐新闻客户端联合搜狗打造首个明星“数字人”主播

    5月17日,在北京举行的"搜狐科技5G&AI峰会"上,搜狐新闻客户端联合搜狗推出首个明星"数字人"主播,以高度逼真的明星形象.多种方言实时播报新闻,让用 ...

  6. 在线产品经理实习 任务三:给搜狐新闻24小时热点做一份产品说明文档

    任务三:给搜狐新闻24小时热点做一份产品说明文档 一.任务简介及要求 出题人:苏伟 搜狐新闻高级产品经理 自从搜狐新闻APP推出了24小时热点后,反响还不错,数据也增长挺快的.市场部和销售部跟我们产品 ...

  7. sohu_news搜狐新闻类型分类

    sohu_news搜狐新闻类型分类 数据获取 数据是从搜狐新闻开放的新闻xml数据,经过一系列的处理之后,生成的一个excel文件 该xml文件的处理有单独的处理过程,就是用pandas处理,该过程在 ...

  8. 设计之下——搜狐新闻客户端的用户体验设计(全彩)

    设计之下--搜狐新闻客户端的用户体验设计(全彩) 宣传语:以真实工作场景讲交互设计.视觉设计流程与方法,及设计师要懂的产品.开发.运营.市场,解决设计师遇到的问题 搜狐新闻客户端UED团队 编著 IS ...

  9. 搜狐新闻客户端Android端侧双擎Hybrid AI框架探索

    本文字数:2917字 预计阅读时间:24分钟 前言 人工智能,深度学习,机器学习,当今已经很广泛的应用到了手机端APP.无论是各类修图软件上的各种抠图美化,实时变装.还是社交软件的图片自动匹配文案.抑 ...

最新文章

  1. docker教程之从一头雾水到不一头雾水(1)
  2. wince 修改dns_如何修改wince的网络配置
  3. PCL已有点类型介绍和增加自定义的点类型
  4. 如何在MySQL中创建存储过程
  5. 【Networking】容器网络大观 SDN 资料汇总
  6. 《Hadoop海量数据处理:技术详解与项目实战(第2版)》一2.8 小结
  7. Docker简单实践(一)
  8. 超声声场模拟_3D打印全息透镜聚焦超声在低成本脑成像中的应用
  9. inline-block的几个问题(还没解决)
  10. 查询数据进行排名,一样的并列
  11. 一个专注SQL优化的IDEA插件(支持DataGrip/Pycharm等) - PawSQL Advisor
  12. 在进行github相关操作的时候一直被要求Enter passphrase for key. 如何避免每次操作都重新填写一遍passphrase?
  13. 表达式计算器-iExpr
  14. Power BI 精美的可视化图表
  15. Python基础教程资料
  16. 处理ThinkPad X12018按电源键无法开机的问题
  17. python爬取拉钩python数据分析职位招聘信息
  18. Kali Linux蓝牙连接问题解决
  19. 啪嗒砰2 刷材料 附如何刷高级素材+BOSS弱点
  20. 麦克风阵列声音定位简介【转】

热门文章

  1. 阿里、网易、华为......滨江哪家公司奋战到最晚?论加班,你是斗不过他们的
  2. 前端面试你需要知道的事情:技术面试流程
  3. 神雕侠侣手游服务器维修到多久,神雕侠侣手游常见问题_神雕侠侣手游问答_疑难解答_九游手机游戏...
  4. 地址池命令 思科理由_Cisco ip helper-address 详解
  5. 通过PubSubHubbub实现YouTube订阅功能
  6. MySQL半同步复制配置
  7. Quartusii 调试工具之In-System Memory Content Editor
  8. VSphere Client无法连接到x.x.x.x,出现未知连接错误
  9. 交友源码中即时通讯怎么工作的?
  10. ORA-00933: SQL 命令未正确结束,原因竟是因为这样...