结巴分词和自然语言处理HanLP处理手记
手记实用系列文章:
3 自然语言处理手记
代码封装类:
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 148 | #!/usr/bin/env python # -*- coding:utf-8 -*- import jieba import os import re import time from jpype import * '' ' title:利用结巴分词进行文本语料的批量处理 1 首先对文本进行遍历查找 2 创建原始文本的保存结构 3 对原文本进行结巴分词和停用词处理 4 对预处理结果进行标准化格式,并保存原文件结构路径 author:白宁超 myblog:http: //www.cnblogs.com/baiboy/ time:2017年4月28日10:03:09 '' ' '' ' 创建文件目录 path:根目录下创建子目录 '' ' def mkdir(path): # 判断路径是否存在 isExists=os.path.exists(path) # 判断结果 if not isExists: os.makedirs(path) print(path+ ' 创建成功' ) return True else : pass print( '-->请稍后,文本正在预处理中...' ) '' ' 结巴分词工具进行中文分词处理: read_folder_path:待处理的原始语料根路径 write_folder_path 中文分词经数据清洗后的语料 '' ' def CHSegment(read_folder_path,write_folder_path): stopwords ={}.fromkeys([line.strip() for line in open( '../Database/stopwords/CH_stopWords.txt' , 'r' ,encoding= 'utf-8' )]) # 停用词表 # 获取待处理根目录下的所有类别 folder_list = os.listdir(read_folder_path) # 类间循环 # print(folder_list) for folder in folder_list: #某类下的路径 new_folder_path = os.path. join (read_folder_path, folder) # 创建一致的保存文件路径 mkdir(write_folder_path+folder) #某类下的保存路径 save_folder_path = os.path. join (write_folder_path, folder) #某类下的全部文件集 # 类内循环 files = os.listdir(new_folder_path) j = 1 for file in files: if j > len(files): break # 读取原始语料 raw = open(os.path. join (new_folder_path, file), 'r' ,encoding= 'utf-8' ).read() # 只保留汉字 # raw1 = re.sub("[A-Za-z0-9\[\`\~\!\@\#\$\^\&\*\(\)\=\|\{\}\'\:\;\'\,\[\]\.\<\>\/\?\~\!\@\#\\\&\*\%]", "", raw) # jieba分词 wordslist = jieba.cut(raw, cut_all=False) # 精确模式 # 停用词处理 cutwordlist= '' for word in wordslist: if word not in stopwords and word== "\n" : cutwordlist+= "\n" # 保持原有文本换行格式 elif len(word)>1 : cutwordlist+=word+ "/" #去除空格 #保存清洗后的数据 with open(os.path. join (save_folder_path,file), 'w' ,encoding= 'utf-8' ) as f: f.write(cutwordlist) j += 1 '' ' 结巴分词工具进行中文分词处理: read_folder_path:待处理的原始语料根路径 write_folder_path 中文分词经数据清洗后的语料 '' ' def HanLPSeg(read_folder_path,write_folder_path): startJVM(getDefaultJVMPath(), "-Djava.class.path=C:\hanlp\hanlp-1.3.2.jar;C:\hanlp" , "-Xms1g" , "-Xmx1g" ) # 启动JVM,Linux需替换分号;为冒号: stopwords ={}.fromkeys([line.strip() for line in open( '../Database/stopwords/CH_stopWords.txt' , 'r' ,encoding= 'utf-8' )]) # 停用词表 # 获取待处理根目录下的所有类别 folder_list = os.listdir(read_folder_path) # 类间循环 # print(folder_list) for folder in folder_list: #某类下的路径 new_folder_path = os.path. join (read_folder_path, folder) # 创建一致的保存文件路径 mkdir(write_folder_path+folder) #某类下的保存路径 save_folder_path = os.path. join (write_folder_path, folder) #某类下的全部文件集 # 类内循环 files = os.listdir(new_folder_path) j = 1 for file in files: if j > len(files): break # 读取原始语料 raw = open(os.path. join (new_folder_path, file), 'r' ,encoding= 'utf-8' ).read() # HanLP分词 HanLP = JClass( 'com.hankcs.hanlp.HanLP' ) wordslist = HanLP.segment(raw) #保存清洗后的数据 wordslist1=str(wordslist).split( "," ) # print(wordslist1[1:len(wordslist1)-1]) flagresult= "" # 去除标签 for v in wordslist1[1:len(wordslist1)-1]: if "/" in v: slope=v.index( "/" ) letter=v[1:slope] if len(letter)>0 and '\n\u3000\u3000' in letter: flagresult+= "\n" else :flagresult+=letter + "/" #去除空格 # print(flagresult) with open(os.path. join (save_folder_path,file), 'w' ,encoding= 'utf-8' ) as f: f.write(flagresult.replace( ' /' , '' )) j += 1 shutdownJVM() if __name__ == '__main__' : print( '开始进行文本分词操作:\n' ) t1 = time.time() dealpath= "../Database/SogouC/FileTest/" savepath= "../Database/SogouCCut/FileTest/" # 待分词的语料类别集根目录 read_folder_path = '../Database/SogouC/FileNews/' write_folder_path = '../Database/SogouCCut/' #jieba中文分词 CHSegment(read_folder_path,write_folder_path) #300个txtq其中结巴分词使用3.31秒 HanLPSeg(read_folder_path,write_folder_path) #300个txt其中hanlp分词使用1.83秒 t2 = time.time() print( '完成中文文本切分: ' +str(t2-t1)+ "秒。" ) |
运行效果:
作者:白宁超,工学硕士,现工作于四川省计算机研究院,研究方向是自然语言处理和机器学习。曾参与国家自然基金项目和四川省科技支撑计划等多个省级项目。著有《自然语言处理理论与实战》一书。 自然语言处理与机器学习技术交流群号:436303759 。
出处:http://www.cnblogs.com/baiboy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2016-10-16 数据挖掘150道笔试题