NLP 分词技术浅析

一、NLP 分词技术概述

(一)定义

自然语言处理(NLP)中的分词技术是将连续的文本序列按照一定的规则切分成有意义的词语的过程。例如,将句子 “我爱自然语言处理” 切分为 “我”、“爱”、“自然语言处理” 或者 “我”、“爱”、“自然”、“语言”、“处理” 等不同的词语组合。

(二)分词技术的重要性

  • 基础作用:分词是 NLP 许多任务的基础,如文本分类、信息检索、机器翻译等。例如在机器翻译中,如果分词不准确,会导致翻译的句子语义混乱。
  • 语义理解:正确的分词有助于更好地理解文本的语义。不同的分词方式可能会导致对句子的理解产生差异。

(三)分词技术的主要方法

1. 基于规则的分词方法
  • 原理:依据语言学的规则和字典来进行分词。例如,最大匹配法,它包括正向最大匹配逆向最大匹配。正向最大匹配是从句子的开头开始,每次尝试匹配字典中最长的词。逆向最大匹配则是从句子的末尾开始。
  • 优点:简单直观,对于一些具有明确语法规则的文本效果较好,而且不需要大量的训练数据。
  • 缺点:规则的制定依赖于人工,对于复杂的语言现象(如歧义、新词等)处理能力有限。
  • #分词方法最大正向切分的实现方式
    
    import re
    import time
    import json
    
    #加载词前缀词典
    #用0和1来区分是前缀还是真词
    #需要注意有的词的前缀也是真词,在记录时不要互相覆盖
    def load_prefix_word_dict(path):
        prefix_dict = {}
        with open(path, encoding="utf8") as f:
            for line in f:
                word = line.split()[0]
                for i in range(1, len(word)):
                    if word[:i] not in prefix_dict: #不能用前缀覆盖词
                        prefix_dict[word[:i]] = 0  #前缀
                prefix_dict[word] = 1  #词
        return prefix_dict
    
    
    #输入字符串和字典,返回词的列表
    def cut_method2(string, prefix_dict):
        if string == "":
            return []
        words = []  # 准备用于放入切好的词
        start_index, end_index = 0, 1  #记录窗口的起始位置
        window = string[start_index:end_index] #从第一个字开始
        find_word = window  # 将第一个字先当做默认词
        while start_index < len(string):
            #窗口没有在词典里出现
            if window not in prefix_dict or end_index > len(string):
                words.append(find_word)  #记录找到的词
                start_index += len(find_word)  #更新起点的位置
                end_index = start_index + 1
                window = string[start_index:end_index]  #从新的位置开始一个字一个字向后找
                find_word = window
            #窗口是一个词
            elif prefix_dict[window] == 1:
                find_word = window  #查找到了一个词,还要在看有没有比他更长的词
                end_index += 1
                window = string[start_index:end_index]
            #窗口是一个前缀
            elif prefix_dict[window] == 0:
                end_index += 1
                window = string[start_index:end_index]
        #最后找到的window如果不在词典里,把单独的字加入切词结果
        if prefix_dict.get(window) != 1:
            words += list(window)
        else:
            words.append(window)
        return words
    
    
    #cut_method是切割函数
    #output_path是输出路径
    def main(cut_method, input_path, output_path):
        word_dict = load_prefix_word_dict("dict.txt")
        writer = open(output_path, "w", encoding="utf8")
        start_time = time.time()
        with open(input_path, encoding="utf8") as f:
            for line in f:
                words = cut_method(line.strip(), word_dict)
                writer.write(" / ".join(words) + "\n")
        writer.close()
        print("耗时:", time.time() - start_time)
        return
    
    
    string = "王羲之草书《平安帖》共有九行"
    # string = "你到很多有钱人家里去看"
    # string = "金鹏期货北京海鹰路营业部总经理陈旭指出"
    # string = "伴随着优雅的西洋乐"
    # string = "非常的幸运"
    prefix_dict = load_prefix_word_dict("dict.txt")
    # print(cut_method2(string, prefix_dict))
    # print(json.dumps(prefix_dict, ensure_ascii=False, indent=2))
    main(cut_method2, "corpus.txt", "cut_method2_output.txt")
    
2. 基于统计的分词方法
  • 原理:利用语料库中词语出现的统计信息来进行分词。常见的有隐马尔可夫模型(HMM)。HMM 假设文本中的每个词是一个状态,词与词之间的转换是一个马尔可夫过程。通过对大量文本的训练,学习到词语出现的概率和转移概率,从而进行分词。
  • 优点:可以处理一些有歧义的情况,并且能够适应新的语言现象。
  • 缺点:需要大量的训练数据来估计概率模型,而且模型相对复杂,训练和推理的时间成本较高。
隐马尔科夫模型
  1. 定义与概念
    • 隐马尔可夫模型(Hidden Markov Model,HMM)是一种统计模型,用于描述一个含有隐含未知参数的马尔可夫过程。它由两个部分组成:一个是马尔可夫链,用于描述状态之间的转移;另一个是观测概率分布,用于描述在每个状态下产生观测值的概率。 
    • 状态转移概率矩阵(A):用一个矩阵来表示状态之间的转移概率。如果用S1表示 “晴天”,S2表示 “雨天”,那么状态转移概率矩阵可能是这样的:
      • 马尔可夫链:假设系统在 t 时刻的状态只与 t-1 时刻的状态有关,而与更早的状态无关。例如,天气变化可以看作一个马尔可夫链,假设今天的天气(晴、雨、阴)只与昨天的天气有关。
      • 隐含状态和观测状态在 HMM 中,存在一些隐藏的状态,我们无法直接观察到,这些状态会生成可观测的输出。以语音识别为例,隐含状态可能是不同的音素,而观测状态是实际听到的语音信号。
    • 观测概率矩阵(B):同样,用一个矩阵来表示在每个隐藏状态下产生不同观测值的概率。用表示 “散步”,表示 “宅家”,观测概率矩阵可能是:

                 

                这表示在晴天的时候,人们出去散步的概率是0.6,宅家的概率是0.4;

                在雨天的时候,人们出去散步的概率是0.2,宅家的概率是0.8。

                4.初始状态概率向量(π):假设一开始晴天的概率是0.6,雨天的概率是0.4,

                那么。整个过程就像是一个有隐藏状态的 “黑箱”,隐藏状态(天气)                  按照一定的概率转移,并且在每个隐藏状态下又按照一定的概率产生观测值。

代码实例(使用 Python 的 hmmlearn 库进行简单的序列生成)

  • 首先,需要安装hmmlearn库。如果没有安装,可以使用pip install hmmlearn命令安装。

  • 以下是一个简单的代码示例,用于生成一个基于 HMM 的观测序列:

  • import numpy as np
    from hmmlearn import hmm
    '''
    首先,我们导入了必要的库numpy和hmmlearn中的hmm模块。
    然后,定义了隐藏状态的数量n_components为 2 和观测状态的数量n_features为 2。
    创建了一个MultinomialHMM对象,它代表一个多项式分布的隐马尔科夫模型。
    接着,我们手动设置了初始状态概率向量model.startprob_、状态转移概率矩阵model.transmat_和观测概率矩阵model.emissionprob_,这些参数与我们前面在天气和活动的例子中解释的类似。
    最后,使用model.sample方法生成了一个长度为 10 的观测序列X和对应的隐藏状态序列Z,并将它们打印出来。
    '''
    
    # 定义隐马尔科夫模型的参数
    # 假设我们有2个隐藏状态和2个观测状态
    n_components = 2
    n_features = 2
    
    # 创建一个隐马尔科夫模型对象
    model = hmm.MultinomialHMM(n_components=n_components)
    
    # 初始化状态转移概率矩阵A
    model.startprob_ = np.array([0.6, 0.4])
    model.transmat_ = np.array([[0.7, 0.3], [0.4, 0.6]])
    
    # 初始化观测概率矩阵B
    model.emissionprob_ = np.array([[0.6, 0.4], [0.2, 0.8]])
    
    # 生成一个长度为10的观测序列
    X, Z = model.sample(n_samples=10)
    print("观测序列:", X)
    print("隐藏状态序列:", Z)
3. 基于深度学习的分词方法
  • 原理:利用神经网络自动学习文本的特征来进行分词。例如,使用长短期记忆网络(LSTM)或者卷积神经网络(CNN)。这些网络可以对文本序列进行编码,然后输出每个位置的分词结果。
  • 优点:能够自动学习到复杂的语言模式,对于未登录词(新词)有较好的处理能力,并且在性能上通常优于传统方法。
  • 缺点:需要大量的训练数据和计算资源,模型解释性相对较差。

二、代码项目示例(以 Python 中的 jieba 分词为例)

        安装 jieba 分词库
  • 如果还没有安装 jieba,可以使用以下命令安装:
  • pip install jieba
    基本分词示例
  • 下面是一个简单的代码,用于对一个句子进行分词。
import jieba
sentence = "我爱自然语言处理"
words = jieba.cut(sentence)
print(" ".join(words))
    • 在这个示例中,jieba.cut函数会对sentence进行分词,返回一个可迭代的生成器对象。通过" ".join(words)将分词结果以空格分隔的字符串形式输出,结果可能是 “我 爱 自然语言处理”。
  1. 精确模式和全模式分词

    • jieba 有精确模式(默认)和全模式。精确模式试图将句子最精确地切开,适合文本分析;全模式把句子中所有的可以成词的词语都扫描出来,速度非常快,但不能解决歧义。
import jieba
sentence = "他说的确实在理"
# 精确模式
words_precise = jieba.cut(sentence, cut_all=False)
print("精确模式:", " ".join(words_precise))
# 全模式
words_full = jieba.cut(sentence, cut_all=True)
print("全模式:", " ".join(words_full))
  • 精确模式可能输出 “他 说 的 确实 在理”,而全模式可能输出 “他 说 的 确实 实在 在意 在理” 等。
添加自定义词典
  • 当遇到一些新词或者专业术语时,可以添加自定义词典来提高分词的准确性。
  • 假设我们有一个自定义词典文件user_dict.txt,内容如下(每行一个词和它的词频等信息,词频可以为整数,这里简单示例):
import jieba
jieba.load_userdict("user_dict.txt")
sentence = "我爱自然语言处理"
words = jieba.cut(sentence)
print(" ".join(words))
  • 这样,在分词的时候,“自然语言处理” 就会被当作一个词来切分,而不是被切成多个部分。
关键词提取(基于 TF - IDF)
  • jieba 还提供了基于 TF - IDF(词频 - 逆文档频率)的关键词提取功能。
import jieba.analyse
sentence = "自然语言处理是计算机科学领域与人工智能领域中的一个重要方向"
keywords = jieba.analyse.extract_tags(sentence, topK=3)
print(keywords)
  • 上述代码中,extract_tags函数会提取句子中的关键词,topK参数指定提取关键词的数量,这里会输出句子中最重要的 3 个关键词,如 ["自然语言处理", "人工智能", "计算机科学"](具体结果可能因语料库等因素略有不同)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/940406.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

排序算法:冒泡排序

每一次顺序便遍历&#xff0c;比较相邻的两个元素&#xff0c;交换。 void bubbleSort(vector<int>&v) { int n v.size();//元素个数 //外层j控制的是待排序区间的长度 for (int j n;j > 1;j--) { bool flag 0;//提高效率&#xff0c;判断比较好了就结束 /…

抽象之诗:C++模板的灵魂与边界

引言 在计算机科学的浩瀚长河中&#xff0c;C模板如同一颗璀璨的星辰&#xff0c;以其独特的泛型编程方式为程序设计注入了灵魂。它是抽象的艺术&#xff0c;是类型的舞蹈&#xff0c;是效率与灵活性的交响乐。模板不仅是一种技术工具&#xff0c;更是一种哲学思考&#xff0c…

Linux通信System V:消息队列 信号量

Linux通信System V&#xff1a;消息队列 & 信号量 一、信号量概念二、信号量意义三、操作系统如何管理ipc资源&#xff08;2.36版本&#xff09;四、如何对信号量资源进行管理 一、信号量概念 信号量本质上就是计数器&#xff0c;用来保护共享资源。多个进程在进行通信时&a…

day4:tomcat—maven-jdk

一&#xff0c;java项目部署过程 编译&#xff1a;使用javac命令将.java源文件编译成.class宇节码文件打包&#xff1a;使用工具如maven或Gradle将项目的依赖、资源和编译后的字节码打包成一个分发格式&#xff0c;如.jar文件&#xff0c;或者.war文件(用于web应用&#xff09…

提炼关键词的力量:AI驱动下的SEO优化策略

内容概要 在当今数字化营销的环境中&#xff0c;关键词对于提升网站的可见性和流量起着至关重要的作用。企业和个人必须重视有效的关键词策略&#xff0c;以便在竞争激烈的网络市场中脱颖而出。本文将深入探讨如何利用人工智能技术来优化SEO策略&#xff0c;特别是在关键词选择…

仓鼠身长能长到多少厘米?

仓鼠&#xff0c;作为颇受欢迎的宠物&#xff0c;其小巧玲珑的身形是吸引众多饲主的重要原因之一。那么&#xff0c;仓鼠的身长究竟能长到多少厘米呢&#xff1f;这背后其实蕴含着不少有趣的知识。 一般而言&#xff0c;常见的仓鼠品种如三线仓鼠、紫仓仓鼠等&#xff0c;成年…

八大设计模式

设计模式在日常软件开发中的重要性 目录 单例模式工厂模式策略模式代理模式观察者模式装饰器模式模板方法模式建造者模式总结 单例模式 单例模式确保一个类只有一个实例&#xff0c;通常用于管理共享资源&#xff0c;如配置、缓存、线程池等。 代码实现&#xff1a;双重检查…

直流充电桩基本工作原理

1、控制导引电路 2、电动汽车直流快充工作原理 1&#xff09;第一阶段 未充电自然状态阶段 充电枪处于自然阶段&#xff0c;充电枪上的按钮没有按下&#xff0c;也就是电路图中的开关S处于接通状态&#xff0c;此时R1 、 R2串联&#xff0c;检测点1处的电压为6V 2&#xff09;…

c4d动画怎么导出mp4视频,c4d动画视频格式设置

宝子们&#xff0c;今天来给大家讲讲 C4D 咋导出mp4视频的方法。通过用图文教程的形式给大家展示得明明白白的&#xff0c;让你能轻松理解和掌握&#xff0c;不管是理论基础&#xff0c;还是实际操作和技能技巧&#xff0c;都能学到&#xff0c;快速入门然后提升自己哦。 c4d动…

【原生js案例】ajax的简易封装实现后端数据交互

ajax是前端与后端数据库进行交互的最基础的工具&#xff0c;第三方的工具库比如jquery,axios都有对ajax进行第二次的封装&#xff0c;fecth是浏览器原生自带的功能&#xff0c;但是它与ajax还是有区别的&#xff0c;总结如下&#xff1a; ajax与fetch对比 实现效果 代码实现 …

Hive其四,Hive的数据导出,案例展示,表类型介绍

目录 一、Hive的数据导出 1&#xff09;导出数据到本地目录 2&#xff09;导出到hdfs的目录下 3&#xff09;直接将结果导出到本地文件中 二、一个案例 三、表类型 1、表类型介绍 2、内部表和外部表转换 3、两种表的区别 4、练习 一、Hive的数据导出 数据导出的分类&…

uniApp使用腾讯地图提示未添加maps模块

uniApp使用腾讯地图&#xff0c;打包提示未添加maps模块解决方案 这是报错信息&#xff0c;在标准基座运行的时候是没问题的&#xff0c;但是打包后会提示未添加&#xff0c;可以通过在mainfest里面把地图插件上腾讯地图的key更换高德地图的key&#xff0c;定位服务可以继续用腾…

OpenCV 学习记录:首篇

最近在学习机器视觉&#xff0c;希望能通过记录博客的形式来鞭策自己坚持学完&#xff0c;同时也把重要的知识点记录下来供参考学习。 1. OpenCV 介绍与模块组成 什么是 OpenCV&#xff1f; OpenCV (Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习软…

白嫖内网穿透之神卓互联Linux安装教程(树莓派)

最近家里有一个树莓派&#xff0c;捣鼓来去不知道干嘛&#xff0c;于是打算作为内网穿透盒子用&#xff0c;于是百度了一下&#xff0c;发现神卓互联还不错&#xff0c;可以让外网请求通过各种复杂的路由和防火墙访问到内网的服务。 以下是在Linux树莓派系统上安装神卓互联客户…

C语言入门(一):A + B _ 基础输入输出

前言 本专栏记录C语言入门100例&#xff0c;这是第&#xff08;一&#xff09;例。 目录 一、【例题1】 1、题目描述 2、代码详解 二、【例题2】 1、题目描述 2、代码详解 三、【例题3】 1、题目描述 2、代码详解 四、【例题4】 1、题目描述 2、代码详解 一、【例…

深度学习实验十七 优化算法比较

目录 一、优化算法的实验设定 1.1 2D可视化实验&#xff08;被优化函数为&#xff09; 1.2 简单拟合实验 二、学习率调整 2.1 AdaGrad算法 2.2 RMSprop算法 三、梯度修正估计 3.1 动量法 3.2 Adam算法 四、被优化函数变为的2D可视化 五、不同优化器的3D可视化对比 …

【计算机组成1】计算机系统

一、计算机的发展 1、计算机硬件的发展 第一代计算机(1946— 1957 年 )——电子管时代。 第二代计算机(1958 — 1964年)——晶体管时代 第三代计算机(1965— 197 1 年) ——中小规模集成电路时代 第四代计算机(1972年至今)——超大规模集成电路时代 计算机硬件的发展就是逻辑元…

指南: 如何在 MEV 项目中使用 Yul

这对我来说是一个反复出现的故事。我学习了一些 Solidity&#xff0c;发现了一个我想要研究的服务。代码看起来是这样的&#xff1a; Seaport Core: BasicOrderFulfiller.sol Solidity 代码在哪里&#xff1f;人们似乎不再使用普通的 Solidity 代码了 &#x1f972; 这种在智能…

每日十题八股-2024年12月19日

1.Bean注入和xml注入最终得到了相同的效果&#xff0c;它们在底层是怎样做的&#xff1f; 2.Spring给我们提供了很多扩展点&#xff0c;这些有了解吗&#xff1f; 3.MVC分层介绍一下&#xff1f; 4.了解SpringMVC的处理流程吗&#xff1f; 5.Handlermapping 和 handleradapter有…

kkfileview代理配置,Vue对接kkfileview实现图片word、excel、pdf预览

kkfileview部署 官网&#xff1a;https://kkfileview.keking.cn/zh-cn/docs/production.html 这个是官网部署网址&#xff0c;这里推荐大家使用docker镜像部署&#xff0c;因为我是直接找运维部署的&#xff0c;所以这里我就不多说明了&#xff0c;主要说下nginx代理配置&am…