中文数据清洗

大体步骤

数据清洗是预处理的第一个步骤,主要是对文本数据进行清理和格式化,以便后续处理,对于中文数据清洗而言,各种查找资料然后总结步骤通常如下:
文本规范化(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.’位置结束。

恢复目录结构代码实现—目前仅差二级与三级目录的抽取

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值