数据清洗
大体步骤
数据清洗是预处理的第一个步骤,主要是对文本数据进行清理和格式化,以便后续处理,对于中文数据清洗而言,各种查找资料然后总结步骤通常如下:
文本规范化(Normalization),将文本中所有的字母统一转换为大写或小写,如不需要标点符号也可以过滤掉文本中的标点符号。
英文语料分词(Tokenization),将文本拆分为无法再分拆的符号。
去除停用词(Stop Word),去除文本中没有意义的停用词
变形标准化(Stemming and Lemmatization),将复数、过去式、动名词等还原。
对于中文数据清洗步骤如下:
相较于英文语料,中文文本规范化需要额外处理繁简转换和全角/半角的问题。
文本规范化(Normalization):将全角字符转换为半角字符、将繁体字转换为简体字、将中文语料中包含的英文大小写统一。
中文分词(Tokenization)
去除停用词(Stop Word)
变形标准化(Stemming and Lemmatization)
1、 分词
分词是将连续的文本切分为独立的单词或词组,是中文文本处理中的关键步骤。常用的分词工具包括jieba。jieba分词支持多种分词模式,包括精确模式、全模式和搜索引擎模式。jieba分词包运用到了数据结构里的字典树对词语进行高效的分类,便于查找,支持三种分词模式:
1、精确模式,试图将句子精确的切开,适合文本分析
2、全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义。
3、搜索引擎模式,在精确模式的基础上,对长词再进行切分,提高召回率,适合用于引擎分词。
import jieba
# 使用jieba进行分词
seg_list = jieba.cut(text, cut_all=False) # 精确模式分词
2、去除停用词
停用词是指在文本中出现频率很高但对语义贡献较小的词,如“的”、“了”等。去除停用词可以降低特征维度并提高模型性能。我们可以使用jieba库中的stopwords功能来去除停用词;停用词是文本中一些高频的代词、连词、介词等对文本分类无意义的词,通常维护一个停用词表,特征提取过程中删除停用表中出现的词,本质上属于特征选择的一部分。参考Hanlp的停用词表https://github.com/hankcs/HanLP
import jieba.analyse
import jieba.posseg as pseg
# 去除停用词示例
stop_words = set(jieba.analyse.get_stopwords('zh')) # 获取停用词列表
word_list = [word for word in seg_list if word not in stop_words] # 去除停用词
词干提取
中文
中文的词干提取与英文不同,因为中文没有像英文中的明确的词干和词缀。通常在中文文本处理中,我们更关注的是分词(Tokenization)和词形归并(Lemmatization)。
分词(Tokenization):中文文本首先需要进行分词,将连续的字符序列切分成有意义的词语。常见的中文分词工具包括 jieba、THULAC(清华大学的中文词法分析工具)、HanLP 等。分词后的结果是一个词语序列,每个词语代表一个基本的语义单位。
词形归并(Lemmatization):与词干提取类似,词形归并是将词语的不同形式归并为同一形式的过程。在中文文本处理中,通常采用的方法是基于词典或规则的归并。例如,将动词的不同时态、名词的不同形式等归并为其基本形式。虽然这种方法并不是严格意义上的词干提取,但可以达到类似的效果。
import jieba
# 中文文本
text = "我喜欢学习自然语言处理。"
# 分词
words = jieba.cut(text)
# 输出分词结果
print("分词结果:", "/".join(words))
# 词形归并(此处不是严格意义上的词干提取,而是简单示例)
# 可以使用自定义词典、规则等方法进行词形归并
英文
在英文文本处理中,词干提取(Stemming)是将词语的词干或基本形式提取出来的过程,即去除单词的词缀,保留单词的核心部分。常用的词干提取算法包括 Porter Stemmer、Snowball Stemmer 等。Python 中的 NLTK(Natural Language Toolkit)库提供了这些算法的实现。
import nltk
from nltk.stem import PorterStemmer
# 初始化词干提取器
stemmer = PorterStemmer()
# 英文单词列表
words = ["running", "ran", "runs", "easily", "feet", "cats"]
# 对每个单词进行词干提取
stemmed_words = [stemmer.stem(word) for word in words]
# 输出结果
print("原始单词列表:", words)
print("词干提取结果:", stemmed_words)
抽取专业术语技术方案-----re依赖包与jieba依赖包
re模块是Python中用于处理正则表达式的核心工具,提供了丰富的功能和灵活的接口,用于处理各种文本处理和分析任务。
原始数据格式:
下面为抽取专业术语的算法(技术方案),实质使用re正则表达式来进行术语的切割与抽取
def convert_to_json():
# 读取文本文件
with open('城市道路交通工程项目规范.txt', 'r', encoding='utf-8') as file:
text = file.read()
# 使用正则表达式将文本分割成每条数据
data_entries = re.findall(r'(\d+)\.(.*?)\n(.*?)\n', text, re.DOTALL)
# print(data_entries,3333)
# 定义存储数据的列表
data_list = []
# 遍历每条数据,构建字典并添加到列表中
for entry in data_entries:
# number = entry[0]
term_and_english = entry[1].strip()
# print(term_and_english, 88888)
description = entry[2].strip()
# 将术语和英文名按中英文分割
term_parts = split_chinese_english(term_and_english)
# 初始化一个空列表来存放所有的元素
combined_array = []
# 遍历元组中的每个数组
for array in term_parts:
# 使用 extend() 方法将数组中的元素添加到 combined_array 中
combined_array.extend(array)
chinese_term = ''
english_name = ''
for part in combined_array:
# 表示的是中文的编码字符集
if re.search(r'[\u4e00-\u9fa5]', part):
chinese_term += part + ' '
# 英文
else:
english_name += part + ' '
chinese_term = chinese_term.strip()
english_name = english_name.strip()
data_dict = {
"术语": chinese_term,
"英文名": english_name,
"术语解释": description
}
data_list.append(data_dict)
# 将数据列表保存到 JSON 文件中
with open('output.json', 'w', encoding='utf-8') as json_file:
json.dump(data_list, json_file, ensure_ascii=False, indent=4)
运行结果:
关于文章的目录层次结构
打算清洗的最终格式为下图所示:采用数组对象的格式,利用嵌套结构来表示层级结构
恢复目录结构技术方案
打算采用re第三方库来实现,进行正则匹配,首先可以将目录的文字组成字典(目录转成数组List),然后在正文中进行匹配切割(循环遍历上面的数组,匹配正文,然后从冒号后面开始截取,直接截取到出现下一个冒号结束,第二级目录同理),从而实现第一级和第二级目录的结构的恢复,第三级目录使用正则匹配(re库)匹配的形式为:‘.num.’,从该处进行截取,然后截取到下一个‘.num.’位置结束。