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

文本预处理

一、文本的基本单位

1、Token

定义:文本的最小单位,例如单词、标点符号。

示例:

原句: "I love NLP."

分词结果: ['I', 'love', 'NLP', '.']

2、语法与语义

语法:词的结构和句子的组合规则。

语义:词的含义和上下文理解。

示例:

句子 "Time flies like an arrow." 有多重解释:

时间像箭一样飞逝。

像箭一样的飞虫在时间中飞翔。

二、基本的文本预处理

1、分词(Tokenization)

  • 英文分词:基于空格或标点分隔。
  • 中文分词:基于统计和规则的方法,如 Jieba。

2、去停用词

停用词:意义较小或频率过高的词,例如 "the", "is", "and"。

3、词干化

将词语削减为根形式,例如 running → run。

4、词形还原

考虑语法规则还原为词的基本形式,例如 mice → mouse。

三、用nltk库做文本预处理

NLTK(Natural Language Toolkit) 是一个功能强大、 灵活性高的开源 Python 库, 专为自然

语言处理(NLP) 领域的研究和开发而设计。 NLTK 提供了一套丰富的工具和资源, 适合处

理、分析和理解人类语言文本。

1、文本预处理包

  • 分词: nltk.tokenize.word_tokenize
  • 停用词库: nltk.corpus.stopwords
  • 词干化: nltk.stem.PorterStemmer
  • 词形还原: nltk.stem.WordNetLemmatizer

2、案例

使用 Python 对自己的文本数据进行分词、去停用词操作,并计算剩余单词的数量

文本如下:

"Dr. Smith's favorite movie in 2024 is 'Inception'; he rates it 9/10 stars! Isn't that amazing? Let's analyze this #text with NLP techniques: @homework1.py, line 42."

代码如下:

from nltk import pos_tag
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from nltk.stem import PorterStemmer,WordNetLemmatizer

from src.common import util

def text_prepare(text):
    #分词
    print(f"原始文本:{text}")
    tokens = word_tokenize(text)
    print(f"分词后:{tokens}")
    #去除停用词
    en_stopwords  = stopwords.words('english') #获取英文停用词表
    print(f"去除停用词前文本长度:{len(tokens)}")

    filter_stop_words = []
    for token in tokens:
        token = token.lower()
        if token not in en_stopwords:
            filter_stop_words.append(token)
    print(f"去除停用词后文本:{filter_stop_words}")
    print(f"去除停用词后文本长度:{len(filter_stop_words)}")

    #词干化
    prepare_stem = []
    porter_stemmer = PorterStemmer()
    for token in filter_stop_words:
        token = porter_stemmer.stem(token)
        prepare_stem.append(token)
    print(f"词干化后:{prepare_stem}")

    #词性标注
    tagged_pos = pos_tag(filter_stop_words)
    print(f"词性标注后:{tagged_pos}")

    #词形还原
    prepare_lemma = []
    wordnetLemma = WordNetLemmatizer()
    for word, pos in tagged_pos:
        prepare_lemma.append(wordnetLemma.lemmatize(word,util.get_wordnet_pos(pos)))
    print(f"词形还原后:{prepare_lemma}")


def main():
    file_path = "example"
    with(open(file_path, "r", encoding="utf-8")) as file:
        text = file.read()
    text_prepare(text)

if __name__ == '__main__':
    main()

运行结果:

原始文本:"Dr. Smith's favorite movie in 2024 is 'Inception'; he rates it 9/10 stars! Isn't that amazing? Let's analyze this #text with NLP techniques: @homework1.py, line 42."

分词后:['``', 'Dr.', 'Smith', "'s", 'favorite', 'movie', 'in', '2024', 'is', "'Inception", "'", ';', 'he', 'rates', 'it', '9/10', 'stars', '!', 'Is', "n't", 'that', 'amazing', '?', 'Let', "'s", 'analyze', 'this', '#', 'text', 'with', 'NLP', 'techniques', ':', '@', 'homework1.py', ',', 'line', '42', '.', "''"]

去除停用词前文本长度:40

去除停用词后文本:['``', 'dr.', 'smith', "'s", 'favorite', 'movie', '2024', "'inception", "'", ';', 'rates', '9/10', 'stars', '!', "n't", 'amazing', '?', 'let', "'s", 'analyze', '#', 'text', 'nlp', 'techniques', ':', '@', 'homework1.py', ',', 'line', '42', '.', "''"]
去除停用词后文本长度:32

词干化后:['``', 'dr.', 'smith', "'s", 'favorit', 'movi', '2024', "'incept", "'", ';', 'rate', '9/10', 'star', '!', "n't", 'amaz', '?', 'let', "'s", 'analyz', '#', 'text', 'nlp', 'techniqu', ':', '@', 'homework1.pi', ',', 'line', '42', '.', "''"]

词性标注后:[('``', '``'), ('dr.', 'NN'), ('smith', 'NN'), ("'s", 'POS'), ('favorite', 'JJ'), ('movie', 'NN'), ('2024', 'CD'), ("'inception", 'NN'), ("'", "''"), (';', ':'), ('rates', 'NNS'), ('9/10', 'CD'), ('stars', 'NNS'), ('!', '.'), ("n't", 'RB'), ('amazing', 'VBG'), ('?', '.'), ('let', 'NN'), ("'s", 'POS'), ('analyze', 'JJ'), ('#', '#'), ('text', 'JJ'), ('nlp', 'NN'), ('techniques', 'NNS'), (':', ':'), ('@', 'NN'), ('homework1.py', 'NN'), (',', ','), ('line', 'NN'), ('42', 'CD'), ('.', '.'), ("''", "''")]

词形还原后:['``', 'dr.', 'smith', "'s", 'favorite', 'movie', '2024', "'inception", "'", ';', 'rate', '9/10', 'star', '!', "n't", 'amaze', '?', 'let', "'s", 'analyze', '#', 'text', 'nlp', 'technique', ':', '@', 'homework1.py', ',', 'line', '42', '.', "''"]


http://www.kler.cn/a/531842.html

相关文章:

  • 3 卷积神经网络CNN
  • Node 服务器数据响应类型处理
  • Spring Boot Web项目全解析:从前端请求到后端处理
  • 首发!ZStack 智塔支持 DeepSeek V3/R1/ Janus Pro,多种国产 CPU/GPU 可私有化部署
  • 【零基础学JAVA】数据类型
  • 自定义数据集 使用paddlepaddle框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测
  • Springboot中@Autowired和@Resource注解的区别和联系
  • Docker 安装详细教程(适用于CentOS 7 系统)
  • 金山打字游戏2010绿色版,Win7-11可用DxWnd完美运行
  • 【PyQt】getattr动态访问对象的属性
  • leetcode——二叉树展开为链表(java)
  • 从 C 到 C++:理解结构体中字符串的存储与操作
  • chrome浏览器chromedriver下载
  • 大数据数仓实战项目(离线数仓+实时数仓)1
  • 《逆向工程核心原理》第一~二章知识整理
  • Vue 3 30天精进之旅:Day 13 - 路由守卫
  • python-leetcode-二叉树的层序遍历
  • 【论文公式】MathType打大写手写字母
  • ANSYS Workbench打开cdb文件
  • Vue-el挂载点
  • 安装及使用Tomcat
  • 软件测试 - 概念篇
  • Python MVC框架和其他Web框架有什么区别?
  • (电脑版)植物大战僵尸幼儿园版本,开启你的冒险之旅!
  • 加载数据,并切分
  • 计算机网络笔记再战——理解几个经典的协议1