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

自然语言处理(02)

NLP文本预处理

文本预处理是自然语言处理(NLP)的基础核心环节,其目标是将“非结构化、含噪声的原始文本”转化为“结构化、低噪声、机器可计算”的数据。预处理的质量直接决定后续模型(如情感分析、文本分类、问答系统)的效果——劣质的预处理会导致“垃圾进、垃圾出”,而优质的预处理能让模型更高效地捕捉语义信息。

文本清洗→分词→词法优化→句法/语义初处理→文本向量化

一、预处理的原则

“任务导向,按需调整”
在开始具体步骤前,需明确一个关键原则:没有“通用的预处理流程”,所有步骤都需结合具体任务调整。例如:

  • 若任务是“情感分析”:需保留“非常”“极其”等情感修饰词,不能作为停用词去除;
  • 若任务是“机器翻译”:需保留完整的句子结构(如标点、连接词),避免过度清洗导致语法丢失;
  • 若任务是“关键词提取”:需优先保留名词、动词,过滤形容词、副词等辅助性词汇。

二、Step 1:文本清洗

去除“噪声”,还原文本核心
原始文本(如爬取的网页、用户评论、社交媒体内容)通常包含大量噪声,需先“净化”。常见噪声类型及处理方法如下:

1. 去除无意义字符与格式噪声

这类噪声不携带语义信息,只会增加计算量,需优先去除。

一、HTML标签/XML标签
1. 处理目标

网页爬取的文本中常包含<div><p><a>等HTML/XML标签,这些标签不携带核心语义,处理目标是剔除这些标签,从结构化标记中提取出纯文本内容,避免标签干扰后续分词或语义分析。

2. 核心工具/方法

使用BeautifulSoup库(Python常用HTML解析库),它能自动解析HTML/XML结构,直接提取标签包裹的文本内容,无需手动编写复杂正则匹配标签。

3. 示例
# 导入解析库
from bs4 import BeautifulSoup# 1. 准备含HTML标签的原始文本(模拟网页爬取结果)
html_text = "<div class='content'>我喜欢NLP!</div><p class='note'>这是一篇教程</p>"# 2. 初始化BeautifulSoup解析器,指定解析器类型为"html.parser"(Python内置,无需额外安装)
soup = BeautifulSoup(html_text, "html.parser")# 3. 提取纯文本:get_text()会自动忽略标签,strip=True去除文本首尾的空白字符(如换行、空格)
clean_text = soup.get_text(strip=True)# 4. 输出结果
print(clean_text)  # 最终输出:"我喜欢NLP!这是一篇教程"
二、URL/邮箱/手机号
1. 处理目标

当任务不涉及“链接访问”“联系方式提取”(如情感分析、文本分类)时,URL(如https://blog.example.com)、邮箱(如abc@xxx.com)、手机号(如138xxxx1234)属于无效信息,处理目标是将这些内容从文本中移除,避免占用计算资源或干扰语义判断。

2. 核心工具/方法

使用Python的re库(正则表达式库),通过编写针对性的正则表达式,精准匹配URL、邮箱、手机号的格式特征,再将匹配到的内容替换为空字符串。

3. 示例
# 导入正则库
import re# 1. 准备含URL和邮箱的原始文本
text = "我的技术博客:https://blog.example.com,有问题可发邮箱:abc_123@xxx.com,也可致电13812345678"# 2. 去除URL:正则匹配"http/https开头的链接"或"www开头的链接"
# 正则说明:https?://\S+ 匹配http/https开头、后续跟非空白字符的内容;www\.\S+ 匹配www.开头的链接
text = re.sub(r'https?://\S+|www\.\S+', '', text)# 3. 去除邮箱:正则匹配"用户名@域名.后缀"格式(支持用户名含数字、下划线,域名含多级后缀如.com.cn)
# 正则说明:\b 表示单词边界,[A-Za-z0-9._%+-]+ 匹配用户名,@[A-Za-z0-9.-]+ 匹配域名,\.[A-Z|a-z]{2,} 匹配后缀(至少2个字母)
text = re.sub(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', '', text)# 4. (可选)去除手机号:以1开头的11位数字(适配国内手机号格式)
text = re.sub(r'1[3-9]\d{9}', '', text)# 5. 输出结果
print(text)  # 最终输出:"我的技术博客:,有问题可发邮箱:,也可致电"
三、特殊符号/表情符号
1. 处理目标

文本中常见的@#$%^&*等特殊符号、等Emoji表情,大多不携带核心语义(除非任务是“表情情感分析”),处理目标是过滤这类符号,仅保留中文、英文、数字和必要的空格,让文本聚焦于核心内容。

2. 核心工具/方法

两种方案结合使用:

  1. emoji库将Emoji转为文本描述(如→:grinning_face:),再用正则删除描述;
  2. re库编写正则,直接匹配并过滤特殊符号,保留关键字符类型。
3. 代码
# 导入所需库
import emoji
import re# 1. 准备含特殊符号和Emoji的原始文本
text = "今天天气真好!😂 #开心 一起去公园吧~ @小明 门票30元/人!"# 2. 处理Emoji:先转文本描述,再删除
# 步骤1:emoji.demojize()将Emoji转为可读文本(如😂→":grinning_face:")
text = emoji.demojize(text)  # 转换后:"今天天气真好!:grinning_face: #开心 一起去公园吧~ @小明 门票30元/人!"
# 步骤2:正则匹配":字母/下划线组成的描述:",替换为空字符串
text = re.sub(r':[a-zA-Z_]+:', '', text)# 3. 处理特殊符号:仅保留中文(\u4e00-\u9fa5)、英文(a-zA-Z)、数字(0-9)和空格(\s),其余符号删除
# 正则说明:[^...] 表示"非该集合内的字符",匹配后替换为空
text = re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9\s]', '', text)# 4. (备选方案)纯正则去除Emoji:若不想安装emoji库,可直接用正则匹配Emoji的Unicode范围
# text = re.sub(r'[\U00010000-\U0010ffff]', '', text)  # 匹配所有Emoji字符# 5. 输出结果
print(text)  # 最终输出:"今天天气真好 开心 一起去公园吧 小明 门票30元人"
四、多余空格/换行符
1. 处理目标

原始文本中常出现“连续多个空格”“换行符”“制表符”等格式问题(如复制粘贴、爬取时的格式残留),这些问题可能导致分词错误(如“我 喜欢”被误判为特殊词)。处理目标是统一文本格式:将所有空白字符(空格、换行、制表符)转为单个空格,并去除文本首尾的空白,确保格式一致性。

2. 核心工具/方法

使用re库的正则匹配,利用\s+(匹配1个及以上空白字符)将所有空白统一替换为单个空格,再用strip()去除首尾空白。

3. 代码
# 导入正则库
import re# 1. 准备含多余空格和换行符的原始文本
text = "我   喜欢\n自然语言处理\t—— 这是我的学习方向  "  # 含3个空格、1个换行符(\n)、1个制表符(\t)、末尾2个空格# 2. 统一空白格式:
# 步骤1:re.sub(r'\s+', ' ', text) —— 匹配所有空白字符(空格/换行/制表符),替换为单个空格
# 步骤2:.strip() —— 去除文本首尾的空白字符(避免开头/结尾残留空格)
text = re.sub(r'\s+', ' ', text).strip()# 3. 输出结果
print(text)  # 最终输出:"我 喜欢 自然语言处理 —— 这是我的学习方向"

2. 文本标准化

统一文本格式,减少冗余(如大小写、拼写错误)。

  • 大小写统一(主要针对英文):将所有字母转为小写或大写,避免“Apple”和“apple”被视为两个不同词。
    text = "I Love NLP"
    text = text.lower()  # 输出:"i love nlp"
    
  • 拼写纠错(中英文均适用):
    • 英文:使用textblobsymspellpy库,例如:
      from textblob import TextBlob
      text = "I love nlp, but I am not good at speling."
      corrected_text = str(TextBlob(text).correct())
      print(corrected_text)  # 输出:"I love nlp, but I am not good at spelling."
      
    • 中文:拼写错误较少(多为形近字,如“应该”→“因该”),可使用pycorrector库:
      from pycorrector import Corrector
      corrector = Corrector()
      text = "我今天因该去学习NLP。"
      corrected_text, detail = corrector.correct(text)
      print(corrected_text)  # 输出:"我今天应该去学习NLP。"
      

三、Step 2:分词——将文本拆分为“最小语义单元”

分词是将连续文本拆分为“词(Token)”或“字”的过程,是机器理解文本的第一步。中英文分词差异极大,需分别处理。

1. 中文分词:解决“无空格分隔”问题

中文句子中没有天然的词边界(如“南京市长江大桥”可能拆为“南京市/长江大桥”或“南京/市长/江大桥”),需依赖“词典+统计模型”实现准确分词。

主流工具: jieba(结巴分词)
1. 核心特点1
  • 拆分逻辑:基于内置词典(涵盖常用中文词汇、专有名词),优先按“最合理的词边界”拆分,不产生冗余词汇(即每个词都是语义完整的最小单元,无重复或多余拆分);
  • 输出特征:结果简洁、精准,符合人类对“词”的常规认知,是最常用的基础模式。
2. 适用场景

需明确词边界、避免冗余的任务,例如:

  • 文本分类(如判断新闻属于“科技”还是“娱乐”,需准确的词作为特征);
  • 情感分析(如从“这款手机续航超棒”中拆分出“手机”“续航”“超棒”,避免冗余词干扰情感判断);
  • 机器翻译(需精准的词对应目标语言词汇,避免拆分混乱导致翻译错误)。
3. 代码
# 1. 导入jieba库(需提前安装:pip install jieba)
import jieba# 2. 准备待分词的中文文本
text = "我喜欢自然语言处理,也爱研究机器学习算法"# 3. 调用精确模式分词:jieba.lcut()返回列表形式的分词结果,cut_all=False表示精确模式(默认也是False,可省略)
tokens = jieba.lcut(text, cut_all=False)  # 若省略cut_all,直接写jieba.lcut(text),效果一致# 4. 输出结果
print("精确模式分词结果:")
print(tokens)  
# 最终输出:['我', '喜欢', '自然语言处理', ',', '也', '爱', '研究', '机器学习', '算法']
# 可见:长词“自然语言处理”“机器学习”被完整保留,无冗余拆分,词边界准确
1. 核心特点2
  • 拆分逻辑:不考虑“最优词边界”,而是将文本中所有可能构成“词”的组合全部拆分出来,会产生大量冗余词汇(同一语义单元可能被拆成多个子词);
  • 输出特征:结果全面、无遗漏,但包含重复语义的词,需后续处理(如去重)。
2. 适用场景

需“尽可能覆盖所有潜在词汇”,不介意冗余的任务,例如:

  • 关键词提取(如从“自然语言处理”中拆分出“自然”“语言”“处理”“自然语言”,扩大关键词候选范围);
  • 新词发现(如从“元宇宙技术”中拆分出“元宇宙”“宇宙”“技术”,辅助识别未收录的新词“元宇宙”);
  • 文本检索的“召回优化”(如用户搜索“语言处理”,全模式拆分的“语言”“处理”可匹配到原文本“自然语言处理”)。
3. 代码
# 1. 导入jieba库
import jieba# 2. 准备与精确模式相同的待分词文本(便于对比差异)
text = "我喜欢自然语言处理,也爱研究机器学习算法"# 3. 调用全模式分词:cut_all=True表示开启全模式
tokens = jieba.lcut(text, cut_all=True)# 4. 输出结果并对比差异
print("全模式分词结果:")
print(tokens)  
# 最终输出:['我', '喜欢', '自然', '自然语言', '语言', '语言处理', '处理', ',', '也', '爱', '研究', '机器', '机器学习', '学习', '算法']
# 对比精确模式:长词“自然语言处理”被拆成“自然”“自然语言”“语言”“语言处理”“处理”,覆盖所有可能的子词;“机器学习”拆成“机器”“机器学习”“学习”,存在冗余
1. 核心特点3
  • 拆分逻辑:是“精确模式的进阶版”——先按精确模式拆分出核心词,再对其中的“长词”进行二次拆分(拆成更短的子词),既保留精确模式的核心词,又补充子词,平衡“精度”和“召回率”;
  • 输出特征:结果无明显冗余,但比精确模式多了长词的子词,比全模式少了无效冗余,是“中间平衡型”模式。
2. 适用场景

需“既保证核心词准确,又覆盖更多子词”的场景,最典型的是:

  • 搜索引擎检索(如用户搜索“自然语言”,既能匹配到精确模式的“自然语言处理”,又能通过拆分出的“自然语言”子词精准命中,避免全模式的冗余干扰);
  • 智能问答的“意图匹配”(如用户问“语言处理怎么学”,拆分出的“语言”“处理”“自然语言”可辅助匹配到“自然语言处理学习指南”类内容)。
3. 代码
# 1. 导入jieba库
import jieba# 2. 准备相同的待分词文本,对比三种模式差异
text = "我喜欢自然语言处理,也爱研究机器学习算法"# 3. 调用搜索引擎模式分词:使用jieba.lcut_for_search(),无需设置cut_all参数
tokens = jieba.lcut_for_search(text)# 4. 输出结果并分析平衡效果
print("搜索引擎模式分词结果:")
print(tokens)  
# 最终输出:['我', '喜欢', '自然', '语言', '自然语言', '处理', '自然语言处理', ',', '也', '爱', '研究', '机器', '学习', '机器学习', '算法']
# 分析平衡效果:
# 1. 保留了精确模式的核心词“自然语言处理”“机器学习”(保证精度);
# 2. 补充了长词的子词“自然”“语言”“处理”“机器”“学习”(提升召回);
# 3. 无全模式的无效冗余(如没有重复的“语言处理”,仅保留必要子词)
进阶优化:自定义词典

若分词结果不符合领域需求(如“NLP”被拆分为“N”“L”“P”),可添加自定义词典:

# 1. 新建自定义词典文件(dict.txt),格式:词 词频 词性(词频与词性可选)
# 示例:NLP 100 n
# 2. 加载自定义词典
jieba.load_userdict("dict.txt")
text = "我喜欢NLP"
tokens = jieba.lcut(text)
print(tokens)  # 输出:['我', '喜欢', 'NLP']

2. 英文分词:基于“空格+标点”拆分

英文句子天然以空格分隔,分词相对简单,主要处理“标点与单词绑定”问题(如“NLP!”需拆为“NLP”和“!”)。

主流工具:nltk、spaCy
  • nltk(轻量,适合入门)
    import nltk
    nltk.download('punkt')  # 下载分词模型
    text = "I love NLP! It's a useful technology."
    tokens = nltk.word_tokenize(text)
    print(tokens)  # 输出:['I', 'love', 'NLP', '!', 'It', "'s", 'a', 'useful', 'technology', '.']
    
  • spaCy(重量级,集成分词、词性标注、NER,适合复杂任务)
    import spacy
    nlp = spacy.load("en_core_web_sm")  # 加载英文小模型
    text = "I love NLP! It's a useful technology."
    doc = nlp(text)
    tokens = [token.text for token in doc]
    print(tokens)  # 输出:['I', 'love', 'NLP', '!', 'It', "'s", 'a', 'useful', 'technology', '.']
    

NLP文本预处理完整流程(非表格版详解)

文本预处理是将“非结构化原始文本”转化为“机器可理解数据”的核心环节,流程遵循“清洗→分词→词法优化→句法/语义初处理→向量化”的逻辑。以下基于原内容框架,去除表格形式,用分层阐述+代码示例的方式,完整拆解每个步骤的目标、工具与实操细节。

四、Step 3:词法优化——筛选“有效词”,减少冗余

分词后得到的Token列表(如['我', '喜欢', '的', '自然语言处理'])中,常包含“高频但语义贡献低”的词(如“的”“the”),需通过去停用词词形归一化(英文场景)优化;中文则补充同义词替换,进一步统一语义。

1. 去停用词(Stopword Removal):剔除“语义噪音词”

停用词是“高频出现但对核心语义无帮助”的词,去除目标是减少计算量、聚焦关键信息,但需遵循**“任务导向,灵活调整”** 原则——例如情感分析中,“非常”“极其”等修饰词不可删除。

(1)中文去停用词:通用词典+自定义补充

中文无统一标准停用词表,需结合“公开词典”和“领域需求”手动调整,常用工具为文本文件加载或自定义集合。

  • 核心操作步骤
    1. 获取通用停用词表:可下载jieba自带停用词表(地址:https://github.com/fxsjy/jieba/blob/master/extra_dict/stop_words.txt)、哈工大停用词表等;
    2. 补充领域停用词:根据任务添加(如电商场景的“亲、哦”,学术场景的“研究、分析”);
    3. 筛选有效词:遍历Token列表,剔除在停用词表中的元素。
  • 代码
    # 1. 加载通用停用词表(用set存储,提升查询效率)
    stop_words = set()
    with open("stop_words.txt", "r", encoding="utf-8") as f:  # 确保文件路径正确for line in f:stop_word = line.strip()  # 去除每行的换行符/空格if stop_word:  # 跳过空行stop_words.add(stop_word)# 2. 补充自定义停用词(如NLP学习场景的“我、的、这”)
    custom_stop_words = {"的", "是", "我", "你", "这", "那", "也"}
    stop_words.update(custom_stop_words)  # 合并到通用停用词表# 3. 对分词结果去停用词
    raw_tokens = ['我', '喜欢', '自然语言处理', '的', '技术', ',', '爱', '研究', '机器学习']
    filtered_tokens = [token for token in raw_tokens if token not in stop_words]# 4. 输出对比
    print("去停用词前:", raw_tokens)
    print("去停用词后:", filtered_tokens)  
    # 结果:['喜欢', '自然语言处理', '技术', ',', '爱', '机器学习'](停用词“我、的、也、研究”被剔除)
    
(2)英文去停用词:库内置词表+大小写统一

英文有成熟的内置停用词表(如nltk、spaCy),无需手动下载,需注意“大小写统一”和“非字母字符过滤”。

  • 核心操作步骤
    1. 加载库内置词表:nltk需先下载stopwords资源,spaCy加载模型后直接获取;
    2. 大小写统一:将Token转为小写(因停用词表多为小写,避免“THE”“The”未匹配);
    3. 过滤非字母:用token.isalpha()剔除标点、数字(如“!”“123”“'s”)。
  • 代码示例(以nltk为例)
    # 1. 导入库并下载停用词资源(首次使用需下载)
    import nltk
    nltk.download('stopwords')# 2. 加载英文通用停用词表(转为set,小写存储)
    stop_words = set(nltk.corpus.stopwords.words('english'))  # 包含"the、a、is"等# 3. 补充自定义停用词(如场景无关的“it's、useful”)
    custom_stop_words = {"it's", "useful", "like"}
    stop_words.update(custom_stop_words)# 4. 去停用词(含大小写统一、过滤非字母)
    raw_tokens = ['I', 'love', 'NLP', '!', 'It', "'s", 'a', 'useful', 'technology', '.']
    filtered_tokens = [token for token in raw_tokensif token.lower() not in stop_words  # 小写匹配停用词表and token.isalpha()  # 仅保留纯字母Token(剔除标点、缩写)
    ]# 5. 输出对比
    print("去停用词前:", raw_tokens)
    print("去停用词后:", filtered_tokens)  
    # 结果:['love', 'NLP', 'technology'](停用词“I、a、useful”及标点被剔除)
    

2. 词形归一化:统一英文词的“不同形态”

中文无词形变化(如“跑”的过去式/复数仍为“跑”),此步骤仅适用于英文——英文中“run→running→ran”“apple→apples”会被视为不同Token,需归一化为“统一原型”,主要分词干提取词形还原两种方法。

(1)词干提取(Stemming):快速规则截断
  • 核心特点:基于固定规则截断词尾(如“ing”“ed”“es”),速度快但精度低,可能生成无意义“伪词根”(如“better→bett”“studies→studi”);
  • 适用场景:数据量大、对精度要求低的任务(如大规模文本检索的初筛);
  • 工具与代码示例(nltk.PorterStemmer)
    # 1. 导入词干提取器
    from nltk.stem import PorterStemmer  # 最常用的英文词干提取器# 2. 初始化提取器
    stemmer = PorterStemmer()# 3. 对不同形态的Token进行词干提取
    raw_tokens = ['love', 'running', 'apples', 'better', 'studies', 'played']
    stemmed_tokens = [stemmer.stem(token) for token in raw_tokens]# 4. 输出对比
    print("原始Token:", raw_tokens)
    print("词干提取后:", stemmed_tokens)  
    # 结果:['love', 'run', 'appl', 'bett', 'studi', 'play'](“apples→appl”“better→bett”为伪词根)
    
(2)词形还原(Lemmatization):精准语法归一
  • 核心特点:基于词典和词性(POS)标签,将词还原为“语法正确的原型”(如“better→good”“apples→apple”),精度高但需依赖词性标注;
  • 适用场景:对语义准确性要求高的任务(如文本分类、情感分析);
  • 工具与代码示例(nltk.WordNetLemmatizer)
    # 1. 导入依赖库(词形还原器、词性标注工具、WordNet词典)
    from nltk.stem import WordNetLemmatizer
    from nltk.corpus import wordnet
    from nltk import pos_tag
    import nltk# 2. 下载必要资源(首次使用需下载)
    nltk.download(['wordnet', 'averaged_perceptron_tagger'])# 3. 初始化词形还原器
    lemmatizer = WordNetLemmatizer()# 4. 辅助函数:将nltk词性标签转为WordNet标签(两者体系不同)
    def get_wordnet_pos(nltk_tag):if nltk_tag.startswith('J'):return wordnet.ADJ  # 形容词(Adjective)elif nltk_tag.startswith('V'):return wordnet.VERB  # 动词(Verb)elif nltk_tag.startswith('N'):return wordnet.NOUN  # 名词(Noun)elif nltk_tag.startswith('R'):return wordnet.ADV  # 副词(Adverb)else:return wordnet.NOUN  # 默认按名词处理# 5. 完整流程:词性标注→词形还原
    raw_tokens = ['love', 'running', 'apples', 'better', 'studies', 'played']
    # 步骤1:词性标注(获取nltk标签,如('running', 'VBG')=动名词)
    nltk_tags = pos_tag(raw_tokens)
    print("词性标注结果:", nltk_tags)  # 输出:[('love', 'VB'), ('running', 'VBG'), ...]# 步骤2:结合词性还原
    lemmatized_tokens = [lemmatizer.lemmatize(token, pos=get_wordnet_pos(tag))for token, tag in nltk_tags
    ]# 6. 输出对比
    print("原始Token:", raw_tokens)
    print("词形还原后:", lemmatized_tokens)  
    # 结果:['love', 'run', 'apple', 'good', 'study', 'play'](全为语法正确的原型)
    
(3)中文补充:同义词替换——统一“同义不同词”

中文存在“同义不同词”(如“电脑→计算机”“开心→高兴”),需通过“同义词词林”归一化,减少语义冗余。

  • 核心工具:哈工大同义词词林(需下载,地址:https://github.com/huyingxi/Synonyms),通过synonyms库实现查询与替换;
  • 关键原则:设置相似度阈值(如0.7),确保替换后的词与原词语义高度一致;
  • 代码示例
    # 1. 安装并导入库(pip install synonyms)
    import synonyms# 2. 原始文本(含多个同义词)
    raw_text = "我今天很开心,在网上购买了新电脑,用来学习自然语言处理。"# 3. 同义词替换(按相似度筛选,取最相似词)
    # 替换“开心”:synonyms.nearby(词, 阈值)返回(同义词列表, 相似度列表)
    happy_syns = synonyms.nearby("开心", 0.7)  # 示例:(['高兴', '快乐'], [0.89, 0.75])
    raw_text = raw_text.replace("开心", happy_syns[0][0])  # 用第一个同义词“高兴”替换# 替换“购买”“电脑”
    buy_syns = synonyms.nearby("购买", 0.7)
    raw_text = raw_text.replace("购买", buy_syns[0][0])  # 如“购买→选购”
    computer_syns = synonyms.nearby("电脑", 0.7)
    raw_text = raw_text.replace("电脑", computer_syns[0][0])  # 如“电脑→计算机”# 4. 输出对比
    print("替换前:", "我今天很开心,在网上购买了新电脑,用来学习自然语言处理。")
    print("替换后:", raw_text)  
    # 结果:"我今天很高兴,在网上选购了新计算机,用来学习自然语言处理。"
    

五、Step 4:句法/语义初处理——为深层理解打基础

经过词法优化的文本已较“干净”,但机器需“结构化信息”(如词的语法角色、实体类型)才能进一步理解,核心步骤为词性标注命名实体识别(NER)

1. 词性标注(POS Tagging):标注词的语法属性

为每个Token标注其语法类别(如名词、动词、形容词),帮助机器理解句子结构(如“动词+名词”构成“动作+对象”)。

(1)中文词性标注:jieba.posseg为核心工具
  • 常用工具:jieba.posseg(轻量、易用)、THULAC(学术场景精度高);
  • 关键标签含义nr=人名,ns=地名,n=名词,v=动词,a=形容词,p=介词;
  • 代码示例(jieba.posseg)
    # 1. 导入词性标注模块
    import jieba.posseg as pseg# 2. 待标注文本
    text = "周杰伦在西安唱《青花瓷》,这首歌发行于2007年。"# 3. 执行词性标注(pseg.lcut()返回包含词和标签的对象)
    pos_result = [(token.word, token.flag) for token in pseg.lcut(text)]# 4. 输出结果
    print("词性标注结果:")
    for word, flag in pos_result:print(f"{word}: {flag}")
    # 部分结果:
    # 周杰伦: nr(人名), 在: p(介词), 西安: ns(地名), 唱: v(动词), 青花瓷: n(名词), 2007年: t(时间)
    
(2)英文词性标注:spaCy精度更优
  • 常用工具:spaCy(标注精度高,支持详细标签与简化标签)、nltk;
  • 关键标签含义PROPN=专有名词,VERB=动词,NOUN=名词,ADJ=形容词;tag_为详细标签(如VBG=动名词),pos_为简化标签;
  • 代码示例(spaCy)
    # 1. 安装并导入spaCy,加载英文小模型(pip install spacy;python -m spacy download en_core_web_sm)
    import spacy# 2. 初始化模型
    nlp = spacy.load("en_core_web_sm")# 3. 待标注文本
    text = "Taylor Swift sang 'Love Story' in New York in 2008."# 4. 执行标注(spaCy自动处理分词与词性)
    doc = nlp(text)
    pos_result = [(token.text, token.pos_, token.tag_) for token in doc]# 5. 输出结果
    print("英文词性标注结果(文本, 简化标签, 详细标签):")
    for text, pos, tag in pos_result:print(f"{text}: {pos} ({tag})")
    # 部分结果:
    # Taylor: PROPN (NNP)(专有名词-人名), sang: VERB (VBD)(动词-过去式), New: PROPN (NNP)(专有名词-地名), 2008: NUM (CD)(数词)
    

2. 命名实体识别(NER):提取“有特定意义的实体”

从文本中识别并分类“专有信息”(如人名、地名、机构名、时间、金额),是信息抽取、知识图谱构建的核心步骤。

(1)中文NER:spaCy中文模型或jieba.analyse
  • 常用工具:spaCy中文模型(精度高,支持多实体类型)、jieba.analyse(轻量,适合简单场景);
  • 核心实体类型PER=人名,LOC/GPE=地名,ORG=机构名,DATE=时间,EVENT=事件;
  • 代码示例(spaCy中文模型)
    # 1. 加载spaCy中文模型(pip install spacy;python -m spacy download zh_core_web_sm)
    import spacy# 2. 初始化模型
    nlp = spacy.load("zh_core_web_sm")# 3. 待识别文本
    text = "2024年,阿里巴巴集团在杭州举办了云栖大会,创始人马云出席并发言。"# 4. 执行NER(spaCy自动识别实体)
    doc = nlp(text)
    ner_result = [(ent.text, ent.label_) for ent in doc.ents]# 5. 输出结果
    print("中文命名实体识别结果(实体, 类型):")
    for ent, label in ner_result:print(f"{ent}: {label}")
    # 结果:
    # 2024年: DATE(时间), 阿里巴巴集团: ORG(机构), 杭州: GPE(地名), 云栖大会: EVENT(事件), 马云: PER(人名)
    
(2)英文NER:spaCy为首选工具
  • 核心实体类型PER=人名,ORG=机构名,GPE=地名,DATE=时间,PRODUCT=产品;
  • 代码示例(spaCy英文模型)
    # 1. 加载spaCy英文模型
    import spacy
    nlp = spacy.load("en_core_web_sm")# 2. 待识别文本
    text = "Apple released the iPhone 15 in September 2023, and Tim Cook attended the launch event in California."# 3. 执行NER
    doc = nlp(text)
    ner_result = [(ent.text, ent.label_) for ent in doc.ents]# 4. 输出结果
    print("英文命名实体识别结果(实体, 类型):")
    for ent, label in ner_result:print(f"{ent}: {label}")
    # 结果:
    # Apple: ORG(机构), iPhone 15: PRODUCT(产品), September 2023: DATE(时间), Tim Cook: PER(人名), California: GPE(地名)
    

六、Step 5:文本向量化——将“词/句子”转为“数字向量”

机器无法直接处理文本,需将“词”或“句子”转化为“低维稠密向量”(Embedding),是衔接“文本预处理”与“模型训练”的关键步骤。根据向量是否携带语义,分为离散表示分布式表示两类。

1. 离散表示:无语义,适合传统机器学习

离散表示仅通过“词的出现与否”或“频率”构建向量,不捕捉语义关联,适合文本分类、关键词提取等传统任务。

(1)One-Hot编码:稀疏独热向量
  • 核心逻辑:为词汇表中每个词分配一个唯一向量,向量长度=词汇表大小,仅对应词的位置为1,其余为0;
  • 缺点:维度灾难(词汇表10万时向量长度10万)、无法捕捉语义(“苹果”与“香蕉”的向量距离=“苹果”与“汽车”);
  • 代码示例(sklearn)
    # 1. 导入One-Hot编码器
    from sklearn.preprocessing import OneHotEncoder
    import numpy as np# 2. 定义词汇表(待编码的词列表)
    vocab = [['苹果'], ['香蕉'], ['橙子'], ['葡萄']]# 3. 初始化编码器(sparse_output=False输出稠密矩阵,便于查看)
    encoder = OneHotEncoder(sparse_output=False)# 4. 执行编码
    one_hot_vecs = encoder.fit_transform(vocab)# 5. 输出结果(对应词汇表顺序)
    print("词汇表:", encoder.get_feature_names_out())
    print("One-Hot向量矩阵:\n", one_hot_vecs)
    # 结果:
    # 词汇表:['苹果' '香蕉' '橙子' '葡萄']
    # 向量矩阵:
    # [[1. 0. 0. 0.]  # 苹果
    #  [0. 1. 0. 0.]  # 香蕉
    #  [0. 0. 1. 0.]  # 橙子
    #  [0. 0. 0. 1.]] # 葡萄
    
(2)TF-IDF:词频-逆文档频率
  • 核心逻辑:通过“词在当前文档的频率(TF)”和“词在所有文档的稀有度(IDF)”衡量词的重要性——TF越高、IDF越高,词的权重越大;
  • 优点:比One-Hot更能体现词的重要性,避免“高频无用词”(如“的”“the”)的干扰;
  • 代码示例(sklearn)
    # 1. 导入TF-IDF向量器
    from sklearn.feature_extraction.text import TfidfVectorizer# 2. 定义文档集合(每个元素是“分词后用空格连接的字符串”)
    documents = ["我 喜欢 苹果 苹果",  # 文档1:“苹果”出现2次"我 喜欢 香蕉",        # 文档2:“香蕉”出现1次"苹果 和 香蕉 都是 水果"  # 文档3:“苹果”“香蕉”各1次
    ]# 3. 初始化向量器(默认过滤停用词,可通过stop_words参数自定义)
    tfidf = TfidfVectorizer()# 4. 执行向量化(生成TF-IDF矩阵:行=文档,列=词,值=权重)
    tfidf_matrix = tfidf.fit_transform(documents)# 5. 输出结果
    print("词汇表(所有文档的不重复词):", tfidf.get_feature_names_out())
    print("TF-IDF矩阵(稠密形式):\n", tfidf_matrix.toarray())
    # 结果解读:
    # 词汇表:['苹果' '喜欢' '香蕉' '都是' '水果']
    # 文档1中“苹果”的权重最高(因在文档1中高频,且在其他文档中出现少);
    # “喜欢”在文档1、2中出现,权重低于“苹果”。
    

2. 分布式表示:含语义,适合深度学习

通过模型训练将词映射为“低维稠密向量”,语义相近的词向量距离更近(如“苹果”与“香蕉”的距离<“苹果”与“汽车”),适合深度学习任务(如BERT分类、对话系统)。

(1)Word2Vec:基于上下文的词向量
  • 核心假设:“上下文相似的词,语义相似”(如“苹果”和“香蕉”常出现在“吃”“买”等词附近,语义相近);
  • 关键参数vector_size=向量维度(常用100/200/300),window=上下文窗口大小,min_count=最小词频(过滤低频词);
  • 代码示例(gensim)
    # 1. 安装并导入gensim(pip install gensim)
    from gensim.models import Word2Vec# 2. 定义训练语料(每个元素是“一篇文档的分词列表”)
    corpus = [["我", "喜欢", "苹果"],["我", "喜欢", "香蕉"],["苹果", "和", "香蕉", "都是", "水果"],["水果", "富含", "维生素"]
    ]# 3. 训练Word2Vec模型
    w2v_model = Word2Vec(sentences=corpus,vector_size=100,  # 向量维度100window=5,         # 上下文窗口大小5min_count=1,      # 保留所有词(无低频过滤)workers=4         # 并行训练线程数
    )# 4. 应用模型:获取词向量、查找相似词
    # 获取“苹果”的词向量
    apple_vec = w2v_model.wv["苹果"]
    print("苹果的词向量维度:", apple_vec.shape)  # 输出:(100,)(100维向量)# 查找与“苹果”语义最相似的前2个词
    similar_words = w2v_model.wv.most_similar("苹果", topn=2)
    print("与苹果相似的词:", similar_words)  # 示例:[('香蕉', 0.85), ('水果', 0.62)](语义越近,相似度越高)
    
(2)BERT Embedding:上下文依赖的向量
  • 核心优势:基于Transformer架构,生成“上下文依赖的向量”——同一词在不同语境下向量不同(如“苹果”在“吃苹果”和“苹果公司”中向量不同),语义捕捉能力最强;
  • 工具:Hugging Face的transformers库,支持中英文预训练模型(如bert-base-chinesebert-base-uncased);
  • 代码示例(中文BERT)
    # 1. 安装依赖(pip install transformers torch)
    from transformers import BertTokenizer, BertModel
    import torch# 2. 加载中文BERT预训练模型与分词器
    tokenizer = BertTokenizer.from_pretrained("bert-base-chinese")  # 分词器
    model = BertModel.from_pretrained("bert-base-chinese")          # 模型# 3. 输入文本(需处理为模型可接受的格式)
    text = "我喜欢苹果公司的产品"# 4. 文本编码(转为token ID、注意力掩码)
    inputs = tokenizer(text,return_tensors="pt",  # 返回PyTorch张量padding=True,         # 自动填充truncation=True       # 自动截断(超过模型最大长度时)
    )# 5. 生成Embedding(禁用梯度计算,提升速度)
    with torch.no_grad():outputs = model(**inputs)# 6. 提取向量(词级向量与句子级向量)
    # word_embeddings:所有token的向量(shape:[批次大小, token数量, 隐藏层维度])
    word_embeddings = outputs.last_hidden_state
    print("词级向量形状:", word_embeddings.shape)  # 示例:torch.Size([1, 8, 768])(1个批次,8个token,768维)# sentence_embedding:句子级向量(模型池化层输出,适合句子级任务)
    sentence_embedding = outputs.pooler_output
    print("句子级向量形状:", sentence_embedding.shape)  # 输出:torch.Size([1, 768])(768维句子向量)
    

七、完整预处理Pipeline示例(中文情感分析任务)

以“电商商品评论情感分析”为例,串联“清洗→分词→词法优化→句法筛选→向量化”全流程,展示实际应用中的操作逻辑:

import re
import jieba
import jieba.posseg as pseg
from sklearn.feature_extraction.text import TfidfVectorizer# 1. 原始文本(模拟电商评论)
raw_text = "这款手机的续航非常好!👍 就是摄像头有点模糊,总体满意~ 详情见:https://example.com"# 2. 文本清洗:去除URL、Emoji、特殊符号
# 去除URL
text = re.sub(r'https?://\S+|www\.\S+', '', raw_text)
# 去除Emoji(先转为文本描述,再删除)
text = re.sub(r':[a-zA-Z_]+:', '', text)
# 保留中文、字母、数字、感叹号/波浪号,删除其他符号
text = re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9!~]', '', text)
# 去除多余空格
text = re.sub(r'\s+', ' ', text).strip()
print("1. 清洗后文本:", text)  # 输出:"这款手机的续航非常好!就是摄像头有点模糊,总体满意~"# 3. 分词(精确模式)
tokens = jieba.lcut(text, cut_all=False)
print("2. 分词结果:", tokens)  # 输出:['这款', '手机', '的', '续航', '非常', '好', '!', ...]# 4. 词法优化:去停用词
stop_words = {"的", "就是", "有点", ",", "!", "~", "这款", "总体"}  # 自定义停用词
filtered_tokens = [token for token in tokens if token not in stop_words]
print("3. 去停用词后:", filtered_tokens)  # 输出:['手机', '续航', '非常', '好', '摄像头', '模糊', '满意']# 5. 句法筛选:保留与情感相关的词性(名词n、形容词a、副词d)
pos_result = [(token.word, token.flag) for token in pseg.lcut(" ".join(filtered_tokens))]
target_pos = {"n", "a", "d"}  # 目标词性:名词、形容词、副词
pos_filtered_tokens = [token for token, flag in pos_result if flag in target_pos]
print("4. 词性筛选后:", pos_filtered_tokens)  # 输出:['手机', '续航', '非常', '好', '摄像头', '模糊', '满意']# 6. 文本向量化:TF-IDF(用于后续情感分析模型输入)
processed_text = " ".join(pos_filtered_tokens)  # 转为字符串格式
tfidf = TfidfVectorizer()
tfidf_vec = tfidf.fit_transform([processed_text])
print("5. TF-IDF词汇表:", tfidf.get_feature_names_out())
print("6. TF-IDF向量:\n", tfidf_vec.toarray())

八、常见误区与避坑指南

  1. 过度清洗:如删除所有标点(导致句子结构丢失,如“今天天气好!”与“今天天气好?”的情感差异被忽略)、过度去停用词(情感分析中删除“非常”“极其”,丢失情感强度信息);
  2. 忽视任务差异:如机器翻译中使用TF-IDF(TF-IDF丢失词序,而翻译需依赖词序生成句子)、关键词提取中使用词形还原(可能丢失“studies”“studying”等词的频率信息);
  3. 中英文混用流程:如用nltk处理中文(会将“自然语言处理”拆分为单个字)、中文分词后进行词干提取(中文无词形变化,此步骤无效);
  4. 跳过词性标注直接向量化:如信息抽取任务中,未筛选“名词、专有名词”等实体相关词性,导致向量包含“副词、介词”等无关信息,降低模型精度。
http://www.dtcms.com/a/415887.html

相关文章:

  • 手机制作网站主页软件博客网页制作代码
  • 单片机入门的相关工具XCOSnTh
  • 基于寄存器的STM32开发指南:使用Keil MDK创建工程模板
  • 有哪些做场景秀的网站网站优化销售话术
  • 高光谱成像在分析作物长势和产量预估中的应用
  • C++面向对象编程——封装
  • 优秀设计作品网站seo综合查询平台官网
  • 海城区建设局网站工会门户网站建设需求
  • 武汉市最新街景图像数据!
  • 自己动手创建一个公司网站国家通建设通网站
  • Docker(二)—— Docker核心功能全解析:网络、资源控制、数据卷与镜像构建实战
  • 百度网站大全首页网站源码免费下载
  • 网站的策划建设方案书负面信息网站
  • 绍兴网站建设方案推广微信公众平台绑定网站
  • 计算机网路-TCP
  • 做网站用哪个预装系统源码建站之网站建设
  • Hadoop完全分布式配置
  • 实用主义观点下的函数式编程思想
  • 服务器及网站建设的特点温州品牌网站建设
  • H618-开发板运行第一个Hello World
  • 青岛网站建设市场分析安徽龙山建设网站
  • 珠海网站建设王道下拉惠太原网站seo外包
  • 门户网站怎么做seo乐清网站
  • 贪心:保卫花园
  • 东莞专业微网站建设价格哪个浏览器可以进wordpress
  • HashMap和Hashtable
  • 做个网站得花多少钱建成区违法建设治理网站
  • 革新深层水平位移监测——安锐科技推出全新节段式位移计,以模块化设计显著降低成本
  • 赣州企业网站在那做网站域名的管理密码如何索取
  • 网站建设与管理大纲天津科技公司网站