基于jiba库分词默认模式分词
一、效果:
1.输出分词和从0开始的一一映射文件
2.输出词频统计文件
3.输出分词文件
二、功能:
1.分词
2.词频统计
3.进行了简单的同义词合并
三、说明:
1.准备用户自定义词典文件(格式:自定义词+空格+词性符号,每行一个词)
2.准备同义词词典文件(格式:准备转化成的那个词+空格+同义词1+空格+同义词2...,每行词数不限)
3.准备停用词词典(每行一个)
4.我的待分词文件是一个csv,第一列是label第二列是要分词内容,根据自己的文件格式在前几行文件导入那块做一下修改就行了
四、代码如下(pycharm)封装成一个函数了
import jieba
"""
准备:待分词文件,第一列为label(情感标签)逗号分割后面是文本内容
输出:1.根据词频由大到小排序后的词频文件fre.txt
2.根据词频由大到小排序后词语重新从0映射的文件 word_list.txt
3.分词后的文字文件cutted.txt 词语间以空格分开
build_vocab函数参数说明:
data_path:数据路径
data_stop_path:停用词典字典
voc_fre_top_n:记录词频排名前n个词
voc_fre_min:记录词的最低词频要求
isprint=False:是否把分词结果存储到out文件中,默认不存储
data_synonym_path:近义词典
data_add_path:自定义词典
"""
def build_vocab(data_path, data_stop_path, data_synonym_path, data_add_path, voc_fre_top_n, voc_fre_min, isprint=False):
data_list = open(data_path).readlines()[1:]
stops_word = open(data_stop_path).readlines()
stops_word = [line.strip() for line in stops_word]
stops_word.append(' ')
stops_word.append('\n')
synonym_words_list = open(data_synonym_path).readlines()
synonym_dict = {}
for i in synonym_words_list:
synonym_dict[i.split()[0]] = i.split()[1:]
jieba.load_userdict(data_add_path)
voc_dict = {}
UNK = '<UNK>'
PAD = '<PAD>'
cutted_list = []
# 分词部分
for item in data_list[:100]:
label = item[0] # 标签列
content = item[2:].strip()
seg_list = jieba.cut(content)
seg_res = []
for seg_item in seg_list:
#去停用词
if seg_item in stops_word:
continue
seg_res.append(seg_item)
for j in synonym_dict.keys():
if seg_item in synonym_dict[j]:
seg_item = j
# 计算词频
if seg_item in voc_dict.keys():
voc_dict[seg_item] += 1
else:
voc_dict[seg_item] = 1
cutted_list.append(seg_res)
voc_fre = sorted([i for i in voc_dict.items() if i[1] > voc_fre_min], key=lambda x: x[1], reverse=True)[
:voc_fre_top_n]
# 构建词或字到索引的映射 从0开始
voc_dict = {word_count[0]: idx for idx, word_count in enumerate(voc_fre)}
# 添加未知符和填充符的映射
voc_dict.update({UNK: len(voc_dict), PAD: len(voc_dict) + 1})
# 输出部分
if isprint:
ff = open('output/word_list.txt', 'w') # 根据词频由大到小排序后词语重新从0映射的文件 word_list.txt
for i in voc_dict.keys():
ff.writelines('{},{}\n'.format(i, voc_dict[i]))
ff1 = open('output/fre.txt', 'w') # 根据词频由大到小排序后的词频文件fre.txt
for i in voc_fre:
ff1.writelines('{},{}\n'.format(i[0], i[1]))
ff2 = open('output/cutted.txt', 'w') # 分词后的文字文件cutted.txt 词语间以空格分开
for i in cutted_list:
for j in i:
ff2.writelines(j + ' ')
ff2.writelines('\n')
return voc_dict, synonym_dict
# data_path='###.csv'
# data_stop_path='/stopword_list.txt'
# voc_fre_top_n=1000
# voc_fre_min=1
# data_synonym_path='synonym.txt'
# data_add_path='/add_word_list.txt'
# build_vocab(data_path, data_stop_path, data_synonym_path, data_add_path, voc_fre_top_n, voc_fre_min, isprint=True)