当前位置: 首页 > article >正文

自然语言处理NLP入门 -- 第二节预处理文本数据

在自然语言处理(NLP)中,数据的质量直接影响模型的表现。文本预处理的目标是清理和标准化文本数据,使其适合机器学习或深度学习模型处理。本章介绍几种常见的文本预处理方法,并通过 Python 代码进行示例。


2.1 文本清理

文本数据往往包含各种噪音,例如 HTML 标签、特殊字符、空格、数字等。清理文本可以提高模型的准确性。

常见的清理步骤

  • 去除 HTML 标签
  • 移除特殊字符(如 @#%$&
  • 移除数字
  • 统一大小写(通常转换为小写)
  • 去除多余的空格

Python 示例

import re  # 正则表达式库,用于文本匹配和替换text = "Hello, <b>world</b>! Visit us at https://example.com or call 123-456-7890."# 1. 去除HTML标签
text = re.sub(r'<.*?>', '', text)# 2. 去除特殊字符(保留字母和空格)
text = re.sub(r'[^a-zA-Z\s]', '', text)# 3. 转换为小写
text = text.lower()# 4. 去除多余空格
text = " ".join(text.split())print(text)

输出:

hello world visit us at httpsexamplecom or call

2.2 分词(Tokenization)

分词是将文本拆分成单个的单词或子词,是 NLP 任务的基础。

常见分词方法

  • 按空格拆分(适用于英文)
  • NLTK 分词(更精准)
  • spaCy 分词(高效处理大规模数据)

Python 示例

import nltk  # 自然语言处理库,提供分词、词性标注、停用词等功能
from nltk.tokenize import word_tokenize, sent_tokenize
import spacy  # 现代 NLP 库,优化分词、词性标注等任务nltk.download('punkt_tab')  # punkt_tab 是 NLTK 中的分词模型text = "Hello world! This is an NLP tutorial."# 1. 基础空格分词
tokens_space = text.split()
print("空格分词:", tokens_space)# 2. 使用 NLTK 进行分词
tokens_nltk = word_tokenize(text)
print("NLTK 分词:", tokens_nltk)# 3. 使用 spaCy 进行分词
nlp = spacy.load("en_core_web_sm")  # 加载预训练的小型英文模型
doc = nlp(text)
tokens_spacy = [token.text for token in doc]
print("spaCy 分词:", tokens_spacy)

输出:

空格分词: ['Hello', 'world!', 'This', 'is', 'an', 'NLP', 'tutorial.']
NLTK 分词: ['Hello', 'world', '!', 'This', 'is', 'an', 'NLP', 'tutorial', '.']
spaCy 分词: ['Hello', 'world', '!', 'This', 'is', 'an', 'NLP', 'tutorial', '.']

注意:

  • 空格分词简单但容易出错,如 “NLP tutorial.” 仍包含标点。
  • NLTK 和 spaCy 处理得更精准,分离了标点符号。

2.3 词干提取(Stemming)和词形还原(Lemmatization)

在 NLP 任务中,单词的不同形式可能具有相同的含义,例如:

  • runningrun
  • bettergood

词干提取和词形还原可以将单词标准化,从而提高模型的泛化能力。

词干提取(Stemming)

词干提取是基于规则的词形归一化方法,会粗暴地去掉单词的后缀。

from nltk.stem import PorterStemmer, SnowballStemmer  # 词干提取工具stemmer = PorterStemmer()  # PorterStemmer 是常用的词干提取方法
words = ["running", "flies", "easily", "studies"]stemmed_words = [stemmer.stem(word) for word in words]
print("Porter Stemmer:", stemmed_words)

输出:

Porter Stemmer: ['run', 'fli', 'easili', 'studi']

缺点:

  • flies 变成了 fli
  • easily 变成了 easili
  • 可能导致含义丢失

词形还原(Lemmatization)

Lemmatization 通过查找词典将单词转换为其词根形式,更加精确。

from nltk.stem import WordNetLemmatizer
import nltknltk.download('wordnet')  # 下载 WordNet 语料库lemmatizer = WordNetLemmatizer()
words = ["running", "flies", "easily", "studies", "better"]lemmatized_words = [lemmatizer.lemmatize(word, pos="v") for word in words]
print("Lemmatization:", lemmatized_words)

输出:

Lemmatization: ['run', 'fly', 'easily', 'study', 'better']

优点:

  • flies 被正确地还原为 fly
  • studies 被正确地还原为 study
  • better 仍保持其正确形式

2.4 停用词(Stopwords)处理

停用词(Stopwords)是指在文本处理中不重要的高频词,如 is, the, and,可以去除以减少模型计算量。

Python 示例

from nltk import word_tokenize
from nltk.corpus import stopwords  # NLTK 提供的停用词库
import nltk
nltk.download('stopwords')  # 下载停用词列表text = "This is a simple NLP example demonstrating stopwords removal."words = word_tokenize(text)filtered_words = [word for word in words if word.lower() not in stopwords.words('english')]
print("去除停用词后:", filtered_words)

输出:

去除停用词后: ['simple', 'NLP', 'example', 'demonstrating', 'stopwords', 'removal', '.']

注意:

  • is, a, this 被去掉
  • NLP 等关键词被保留

2.5 难点总结

  • 分词的不同方法:空格分词 vs. NLTK vs. spaCy,适用于不同场景。
  • 词干提取 vs. 词形还原:Stemming 可能会导致错误,而 Lemmatization 更精确但需要额外的词性信息。
  • 停用词的处理:某些 NLP 任务(如情感分析)可能需要保留停用词。

2.6 课后练习

练习 1:文本清理

清理以下文本,去掉 HTML 标签、特殊字符、数字,并转换为小写:

text = "Visit our <b>website</b>: https://example.com!!! Call us at 987-654-3210."

练习 2:使用 spaCy 进行分词

使用 spaCy 对以下文本进行分词:

text = "Natural Language Processing is fun and useful!"

练习 3:词形还原

使用 Lemmatization 处理以下单词:

words = ["running", "mice", "better", "studying"]

练习 4:去除停用词

从以下文本中去除停用词:

text = "This is an example sentence demonstrating stopwords removal."

相关文章:

自然语言处理NLP入门 -- 第二节预处理文本数据

在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;数据的质量直接影响模型的表现。文本预处理的目标是清理和标准化文本数据&#xff0c;使其适合机器学习或深度学习模型处理。本章介绍几种常见的文本预处理方法&#xff0c;并通过 Python 代码进行示例。 2.1 文本清理…...

android launcher拖动图标释放错位

由于为了设备流畅把所有动画效果设置为0.5&#xff0c;不设置为0是因为锁屏在开机时会有闪黑屏的现象。在此背景下&#xff0c;测试发现在拖动桌面图标时&#xff0c;在图标动画过程中错位时释放图标&#xff0c;则图标会留在错位的位置&#xff0c;不会自动对齐。 原因就是动…...

小结:OSPF的网络类型,LSA

OSPF&#xff08;Open Shortest Path First&#xff09;是一个基于链路状态的内部网关协议&#xff08;IGP&#xff09;。以下是对OSPF网络类型、LSA类型、序列号与Age作用&#xff0c;以及相关配置指令的详细讲解。 一、OSPF的网络类型 OSPF支持多种网络类型&#xff0c;不同…...

Unity URP的2D光照简介

官网工程&#xff0c;包括2d光照&#xff0c;动画&#xff0c;动效介绍&#xff1a; https://unity.com/cn/blog/games/happy-harvest-demo-latest-2d-techniques https://docs.unity3d.com/6000.0/Documentation/Manual/urp/Lights-2D-intro.html 人物脸部光照细节和脚上的阴影…...

笔试题笔记#3

1 一道bfs&#xff0c;唯一不同的是要对单链表中后继节点的编号排序 #include<bits/stdc.h> using namespace std;const int N10000;vector<int> headofNode[N]; int n,m; int d; bool st[N]; int parent[N]; vector<int> ans;void PrintAns(int i){//cout…...

Jenkins 部署 之 Mac 一

Jenkins 部署 之 Mac 一 一.Jenkins 部署依赖 JDK 环境 查看 Mac JDK 环境&#xff0c;如果没有安装&#xff0c;先安装 打开终端输入命令:java -version Mac安装配置 JDK 二. 检查 HomeBrew 安装 检查 HomeBrew 是否安装&#xff0c;终端输入命令:brew -v Mac安装HomeB…...

iOS Swift算法之KDF2

后端用Java开发的&#xff0c;用到了org.bouncycastle.crypto.generators.KDF2BytesGenerator&#xff0c;一开始在网上各种搜&#xff0c;没找到相关的接口或第三方库&#xff0c;白白浪费了几天时间&#xff0c;后面才想到照着Java代码自己实现&#xff0c;于是乎参考BaseKDF…...

钉钉位置偏移解决,钉钉虚拟定位打卡

虚拟定位打卡工具 一&#xff0c;介绍免费获取工具 一&#xff0c;介绍 提到上班打卡&#xff0c;职场人的内心戏估计能拍成一部连续剧。打卡&#xff0c;这俩字仿佛自带“紧箍咒”&#xff0c;让无数打工人又爱又恨。想象一下&#xff0c;你气喘吁吁地冲进办公室&#xff0c;…...

windows基于cpu安装pytorch运行faster-whisper-large-v3实现语音转文字

1.创建虚拟环境 conda create -n faster-whisper python3.10 conda activate faster-whisper 2.安装cpu版本的pytorch pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple 3.验证pytorch安装结果 (faster-whisper) H:\big-model\faste…...

写一个鼠标拖尾特效

思路和逻辑 要实现鼠标拖尾特效&#xff0c;我们需要&#xff1a; 监听鼠标移动事件&#xff0c;获取鼠标的当前位置。在每次鼠标移动时&#xff0c;绘制一个小圆点或其他形状在鼠标的当前位置。将所有绘制的圆点连接起来&#xff0c;形成一条“尾巴”。使用动画效果让尾巴看…...

《深度LSTM vs 普通LSTM:训练与效果的深度剖析》

在深度学习领域&#xff0c;长短期记忆网络&#xff08;LSTM&#xff09;以其出色的处理序列数据能力而备受瞩目。而深度LSTM作为LSTM的扩展形式&#xff0c;与普通LSTM在训练和效果上存在着一些显著的不同。 训练方面 参数数量与计算量&#xff1a;普通LSTM通常只有一层或较少…...

【使用 rimraf 闪电删除 node_modules 目录】

使用 rimraf 闪电删除 node_modules 目录 你是否还在为删除项目下庞大的 node_modules 苦苦挣扎。删除失败&#xff0c;权限不足&#xff0c;响应半天后&#xff0c;响应半天后的失败。快来试试 rimraf 闪电般删除吧&#xff01; 为什么需要专门工具删除 node_modules&#xff…...

使用DeepSeek和Kimi快速自动生成PPT

目录 步骤1&#xff1a;在DeepSeek中生成要制作的PPT主要大纲内容。 &#xff08;1&#xff09;在DeepSeek网页端生成 &#xff08;2&#xff09;在本地部署DeepSeek后&#xff0c;使用chatBox生成PPT内容 步骤2&#xff1a;将DeepSeek成的PPT内容复制到Kimi中 步骤3&…...

Webpack包

黑马程序员视频地址&#xff1a; Node.js与Webpack-16.Webpack简介以及体验 前言&#xff1a; 本篇中部分标题后标有数字&#xff0c;代表学习顺序 &#xff0c;同时也可以作为使用顺序参考 webpack包 基础认识 初步使用 下载webpack包和webpack-cli包 注意点&#xff1a; 1…...

鸿蒙HarmonyOS NEXT开发:横竖屏切换开发实践

文章目录 一、概述二、窗口旋转说明1、配置module.json5的orientation字段2、调用窗口的setPreferredOrientation方法 四、性能优化1、使用自定义组件冻结2、对图片使用autoResize3、排查一些耗时操作 四、常见场景示例1、视频类应用横竖屏开发2、游戏类应用横屏开发 五、其他常…...

flink判断两个事件之间有没有超时(不使用CEP)

1.为啥不使用cep呢&#xff0c;cep的超时时间设置不好配置化&#xff0c;无法满足扩展要求 2.超时怎么界定。A事件发生后&#xff0c;过了N时间&#xff0c;还没有收到B事件&#xff0c;算超时。 代码如下&#xff1a; import com.alibaba.fastjson.JSONObject; import lombo…...

数学建模与MATLAB实现:稳定状态模型与资源管理策略

引言 在实际问题中&#xff0c;动态过程的瞬时性态往往难以直接分析&#xff0c;而研究其稳定状态的特征则更具实际意义。本章介绍如何通过微分方程稳定性理论&#xff0c;结合再生资源管理、种群竞争等案例&#xff0c;分析系统的平衡点及稳定性&#xff0c;为实际决策提供数…...

爬虫代码中如何设置请求间隔?

在爬虫代码中设置请求间隔是确保爬虫稳定运行并避免对目标服务器造成过大压力的重要措施。合理设置请求间隔可以有效降低被目标网站封禁IP的风险&#xff0c;同时也有助于爬虫程序的稳定运行。以下是几种常见的方法来设置请求间隔&#xff1a; 一、使用time.sleep() time.sle…...

基于Spring Security 6的OAuth2 系列之十五 - 高级特性--客户端认证方式

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级…...

bug-ant下拉框解决下拉框跟随表单容器(指定下拉框挂载容器):getPopupContainer=“p=>p.parentNode“

1.前言 getPopupContainer是Ant Design Vue&#xff08;简称Antd&#xff09;的<a-select>组件的一个属性&#xff0c;用于指定下拉框的挂载容器。默认情况下&#xff0c;下拉框会挂载到body元素上&#xff0c;但有时你可能需要将下拉框挂载到其他元素上&#xff0c;例如…...

驱动开发系列35 - Linux Graphics GEM Buffer Object 介绍

一:概述 在 Linux 内核中,DRM(Direct Rendering Manager)模块 是用于管理显示硬件和图形渲染的核心框架。它负责协调用户空间应用程序(例如 X Server、Wayland Compositors、Mesa 等)和 GPU 硬件之间的通信,是 Linux 图形子系统的重要组成部分。 GEM (Graphics Executio…...

网络安全检测思路

对于主机的安全检测&#xff0c;我们通常直接采用nmap或者类似软件进行扫描&#xff0c;然后针对主机操作系统及其 开放端口判断主机的安全程度&#xff0c;这当然是一种方法&#xff0c;但这种方法往往失之粗糙&#xff0c;我仔细考虑了一下&#xff0c;觉 得按下面的流程进行…...

vue error Expected indentation of 2 spaces but found 4 indent

问题的原因在于eslint的风格样式缩进检测&#xff0c;eslint给出的规则是2个缩进&#xff0c;但我们通常是4个缩进&#xff0c;这就造成了报错。 关闭eslint的缩进不同报错&#xff1a;.eslintrc.js indent:off, 全部配置&#xff1a; module.exports {root: true,parserOpt…...

回环地址127.0.0.1跟自身IP有什么区别?

区别比较显著&#xff1a; 1.从定义上看&#xff1a; 127.0.0.1&#xff1a;这个地址被称为回环地址&#xff08;Loopback Address&#xff09;&#xff0c;是用于本地通信的特殊IP地址&#xff0c;指向计算机自身。它用于测试和调试网络应用程序&#xff0c;无论设备是否连接…...

SQL CASE表达式的用法

SQL CASE表达式的用法 一、CASE表达式的基础语法简单CASE表达式搜索CASE表达式 二、简单CASE表达式的应用示例三、搜索CASE表达式的应用示例四、CASE表达式在聚合函数中的应用五、嵌套CASE表达式的应用 今天在也无力用到了CASE表达式&#xff0c;于是有了这篇博客&#xff0c;C…...

排序合集之快排详解(二)

摘要&#xff1a;快速排序是一种在实践中广泛使用的高效排序算法。它基于分治策略&#xff0c;平均时间复杂度为O(n log n)&#xff0c;使其成为处理大型数据集的理想选择。本文将深入探讨快速排序的各种实现方式、优化技巧以及非递归实现&#xff0c;并通过C语言代码示例进行详…...

前缀树算法篇:前缀信息的巧妙获取

前缀树算法篇&#xff1a;前缀信息的巧妙获取 那么前缀树算法是一个非常常用的算法&#xff0c;那么在介绍我们前缀树具体的原理以及实现上&#xff0c;我们先来说一下我们前缀树所应用的一个场景&#xff0c;那么在一个字符串的数据集合当中&#xff0c;那么我们查询我们某个字…...

shell脚本自动安装MySQL8

环境&#xff1a;centos7版本&#xff1a;8.0.28安装包&#xff1a;mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz 二进制包要求&#xff1a;安装包和shell脚本在同一目录下执行方式&#xff1a;sudo ./install_mysql8.sh #!/bin/bash# 定义MySQL安装目录和压缩包名称MYSQL_DIR…...

当没有OpenGL时,Skia如何绘制?

Skia 是可以在没有 OpenGL 的情况下进行图形绘制的&#xff0c;但是具体能否成功绘制图形&#xff0c;取决于 Skia 是如何配置的&#xff0c;以及平台上是否提供了其他的底层图形 API。 Skia 的底层依赖 Skia 的目标是提供一种跨平台的 2D 图形绘制接口。为了加速图形渲染&…...

大数据系列 | 白话讲解大数据技术生态中Hadoop、Hive、Spark的关系介绍

大数据属于数据管理系统的范畴&#xff0c;数据管理系统无非就两个问题&#xff1a;数据怎么存、数据怎么算    现在的信息爆炸时代&#xff0c;一台服务器数据存不下&#xff0c;可以找10台服务器存储&#xff0c;10台存储不下&#xff0c;可以再找100台服务器存储。但是这1…...