中文文本数据常见预处理方法实现

技术

在中文文本数据处理中,预处理不仅能够清洗噪声和规范格式,还有助于解决中文语言特有的问题,如繁简体转换、全半角字符转换、数据编码等,以及进行中文分词和词性标注,从而为后续的文本挖掘、情感分析、文本分类等任务提供更可靠的数据基础,接下来将利用python实现分词、去停用词、去特殊字符、保留指定长度字符、词频统计、多频词删除、词袋模型、TF-IDF模型、词云图生成等操作

1. 数据展示


          
import pandas as pd
          
column_names = ['文章内容']
          
df = pd.read_csv('环境监测与环境影响评价(摘要utf8).txt', sep='\t', encoding='utf-8',header=None, names=column_names)
          
df.head()
      

picture.image

2. 分词


          
import jieba
          
jieba.load_userdict('专业词语.txt')
          
df['分词'] = df['文章内容'].apply(lambda x: jieba.lcut(x))
          
df.head()
      

picture.image

在中文文本中,分词是将连续的汉字序列切分成有意义的词语的过程,由于中文中并没有像空格这样的显式分隔符来标识词语之间的边界,所以分词是中文文本处理中的重要步骤,分词可以通过基于规则的方法、统计方法或者深度学习方法来实现,常见的中文分词工具有jieba、PKU分词器、清华大学THULAC等,分词的准确性对于中文自然语言处理任务的结果有很大影响,因此分词是中文文本处理中的一个关键步骤

在这里 使用load_userdict函数加载自定义的词语词典文件-专业词语.txt

picture.image

在中文分词中,有时候一些专业术语、行业名词或者特定领域的术语可能无法被通用的分词工具正确识别,因此可以通过加载用户自定义的词典来增加分词工具的词库,提高分词的准确性,加载用户自定义词典后,分词工具会优先使用自定义词典中的词语进行分词,从而更好地适应特定领域或者专业场景的文本处理需求

3. 去停用词


          
stopWords = pd.read_csv('哈工大中文停用词.txt', sep='hahaha')
          
stopWords = ['\n']+list(stopWords.iloc[:, 0])
          
df['去停用词'] = df['分词'].apply(lambda x: [i for i in x if i not in stopWords])
          
df.head()
      

picture.image

在中文文本处理中,去停用词是指将文本中出现频率很高但携带的信息量很低的词语去除的过程,这些词语通常是语言中的常用词汇,如“的”、“是”、“在”、“有”等,它们在大多数文本中都会频繁出现,但对于文本的语义分析并没有太多帮助,因此可以被视为停用词, 去停用词的目的是减少文本数据的噪音,提高文本处理任务的效率和准确性,通过去除停用词,可以使得文本数据更加精炼,突出关键信息,有利于后续的文本分析、文本挖掘或者机器学习任务的进行,常见的停用词列表包括了语言中的常用词汇、介词、连词、助词等,在进行文本处理任务时,可以根据需要选择相应的停用词表进行去停用词处理

在这里读取的是哈工大停用词作为去停用词模板,其中['\n'] 是用来添加一个换行符到停用词列表当中,当然读者可以自行添加更多停用词进行去除

4. 去特殊字符


          
import re
          
# 定义正则表达式,用于匹配标点符号、数字和表情符号
          
pattern = r'[^\u4e00-\u9fa5a-zA-Z]'  # 匹配非中文和非英文的字符
          
def remove_special_characters(text):
          
    return re.sub(pattern, '', text)
          
df['去特殊字符'] = df['去停用词'].apply(lambda x: [remove_special_characters(word) for word in x])
          
df.head()
      

picture.image

去除一些特殊字符,比如标点符号、数字、表情符号等,这些字符通常对于文本分析和建模没有太大帮助,进而提高中文文本处理任务的准确性、降低文本噪音、减小数据量并统一文本格式

5. 保留指定长度字符


          
# 删除长度为1的词语
          
df['len>1'] = df['去特殊字符'].apply(lambda x: [i for i in x if len(i) > 1])
          
df.head()
      

picture.image

删除指定长度的词语可以减少文本中的无意义的片段,保留指定长度字符有助于保留更具实际意义的词汇,提高文本处理的精确度和语义表达的准确性

6. 词频统计

6.1 对每篇文章中的词语进行词频统计


          
from collections import Counter
          

          
# 对每篇文章中的词语进行词频统计
          
df['词频统计'] = df['len>1'].apply(lambda x: Counter(x))
          

          

          
# 输出词频前三的词语及词频数
          
for index, row in df.iterrows():
          
    # 获取词频统计结果
          
    word_count = row['词频统计']
          
    # 对词频统计结果按词频降序排序
          
    sorted_word_count = sorted(word_count.items(), key=lambda x: x[1], reverse=True)
          
    # 取出词频前三的词语及词频数
          
    top_three = sorted_word_count[:3]
          
    # 打印词频前三的词语及词频数
          
    print(f"文章 {index + 1} 词频前三统计:")
          
    for word, count in top_three:
          
        print(f"{word}: {count}")
      

picture.image

6.2 对所有文章中的词语进行词频统计


          
# 合并所有文章中的词语为一个列表
          
all_words = [word for sublist in df['len>1'] for word in sublist]
          

          
# 对合并后的词语列表进行词频统计
          
word_count = Counter(all_words)
          

          
# 输出词频前三的词语及词频数
          
print("所有文章中词频前三统计:")
          
for word, count in word_count.most_common(20):
          
    print(f"{word}: {count}")
      

picture.image

通过词频统计可以在中文文本中揭示文本内容、识别关键词、进行数据预处理

7. 删除指定词语


          
def remove_words(data_column, words_to_remove):
          
    """
          
    从指定的 DataFrame 列中删除指定的词语。
          

          
    参数:
          
    data_column: DataFrame 列,包含词语列表。
          
    words_to_remove: 要删除的词语列表。
          

          
    返回:
          
    删除指定词语后的新列。
          
    """
          
    # 对每个词语列表进行遍历
          
    updated_column = data_column.apply(lambda x: [word for word in x if word not in words_to_remove])
          

          
    return updated_column
          

          
# 要删除的词语列表
          
words_to_remove = ['我国', '本文']
          

          
# 删除指定词语后的新列
          
df['删除指定词语'] = remove_words(df['len>1'], words_to_remove)
          
df.head()
      

picture.image

通过删除指定词语在中文文本分析中起到了精简文本、去除噪音、提高模型效果和改善文本质量等作用,有助于提高文本分析的效率和准确性,这里在前文进行词频统计发现我国、本文这种对于模型的信息提取并不重要的词频占比较大,可进行删除处理(当然在一些模型构建的时候如TF-IDF可添加参数进行限制多频词语对模型的影响max_features=3000, min_df=2这里的参数含义就代表只针对频数大于2小于3000的词频进行建模)

8. 词袋模型


          
from gensim import corpora
          
from gensim.models import LdaModel
          

          
# 创建词典
          
dictionary = corpora.Dictionary(df['len>1'])
          
# 创建文档-词矩阵 词袋模型
          
corpus = [dictionary.doc2bow(text) for text in df['len>1']]
          
# 查看token2id
          
print("Token to ID mapping:")
          
print(dictionary.token2id)
      

picture.image

词袋模型在中文文本中的作用是将文本数据转换为数值化的向量表示,并提取文本的特征信息,从而实现对文本的表示、分类和聚类等任务

词袋模型是一种简单而常用的文本表示方法,其表达形式可以用一个由词语构成的向量来表示文本,具体地,词袋模型将文本视为一个由词语组成的集合,其中每个词语都是文本中的一个特征,而这些特征构成了一个词汇表,文本中的每个词语在词汇表中对应一个维度,而每个维度上的值表示了对应词语在文本中的出现次数

例如,假设有一个词汇表包含了词语["apple", "banana", "orange", "juice"],而某个文本中包含了"apple"出现2次,"banana"出现1次,"orange"出现0次,"juice"出现3次,则该文本可以用一个向量表示为[2, 1, 0, 3],其中向量的每个元素分别表示了词汇表中对应词语在文本中的出现次数

9. TF-IDF模型


          
from sklearn.feature_extraction.text import TfidfVectorizer
          
# 将列表转换为字符串
          
text_data = df['len>1'].apply(lambda x: ' '.join(x))
          

          
tfdif = TfidfVectorizer(stop_words=None, max_features=3000, min_df=2 ,analyzer='word')
          
t = tfdif.fit_transform(text_data) # 稀疏矩阵
          
t_weight = t.toarray() # 稠密矩阵
          
print(t_weight) 
          
print(t.shape)
      

picture.image

TF-IDF在中文文本中的作用是帮助识别关键词、计算文本相似度、进行文本分类以及生成文本摘要等任务,是文本处理和自然语言处理中的重要工具之一,详细TF-IDF查看以下链接: TF-IDF模型

10. 词云图绘制


          
from wordcloud import WordCloud
          
import matplotlib.pyplot as plt
          
# 设置中文字体
          
plt.rcParams['font.sans-serif']='SimHei'
          
%config InlineBackend.figure_format = 'svg'
          

          
all_words = [word for sublist in df['len>1'] for word in sublist]
          
word_count = Counter(all_words)
          

          
font_path = 'C:/Windows/Fonts/simsun.ttc'  # 宋体
          
# 创建词云对象并生成词云图
          
wordcloud = WordCloud(font_path=font_path, width=800, height=400, background_color='white').generate_from_frequencies(word_count)
          

          
# 可视化词云图
          
plt.figure(figsize=(10, 6))
          
plt.imshow(wordcloud, interpolation='bilinear')
          
plt.axis("off")
          
plt.show()
      

picture.image

11. 总结

以上这些操作能够对中文文本进行预处理和特征提取,为构建各种文本分析模型提供有力支持,从而提高模型的性能和效果,当然除了本文介绍的这些中文文本数据处理方法以外还存在众多处理方法如Word2vec、n-gram等

12. 往期推荐

常见激活函数详解

特征工程——数据转换

回归任务常见评价指标解读以及Python实现

掌握主题模型:用Python实现LDA并通过pyLDAvis.gensim打造直观可视化

基于VMD分解的VMD-CNN-LSTM时间序列预测模型实现

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
vivo 容器化平台架构与核心能力建设实践
为了实现规模化降本提效的目标,vivo 确定了基于云原生理念构建容器化生态的目标。在容器化生态发展过程中,平台架构不断演进,并针对业务的痛点和诉求,持续完善容器化能力矩阵。本次演讲将会介绍 vivo 容器化平台及主要子系统的架构设计,并分享重点建设的容器化核心能力。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论