自然语言处理(jieba库分词)

news/2024/9/28 11:13:08 标签: 自然语言处理, python, 中文分词

1、完全切分法、正向最大匹配算法、逆向最大匹配算法和双向最大匹配算法

一、实验内容

一个好的NLP系统一定要有完备的词典,用于判断算法分出的词是否是具有实际意义的词。自定义一个词典,比如dic = ["项目", "研究", "目的", "商品", "服务", "和服", "和尚", "尚未", "生命", "起源", "当下", "雨天", "地面", "积水", "下雨天", "欢迎", "老师", "生前", "就餐", "迎新", "师生", "前来"]。实现相关的分词方法:完全切分、正向最长匹配、逆向最长匹配、双向最长匹配算法,并输入一些句子验证分词结果的正确性

二、实现步奏

(一)新建Python工程NLPExp01

1.打开编辑器,新建NLPExp01工程

 2.打开对应工程,在对应目录下新建python文件exp01.py

(二)定义字典内容,实现不同的分词模式

1.字典内容可自定义,如 ["项目", "研究", "目的", "商品", "服务", "和服", "和尚", "尚未", "生命", "起源", "当下", "雨天", "地面", "积水", "下雨天", "欢迎", "老师", "生前", "就餐", "迎新", "师生", "前来"]

2.实现对应的分词匹配算法:完全切分法、正向最大匹配算法、逆向最大匹配算法和双向最大匹配算法

3.输入验证字符,检查分词结果,至少输入“和尚尚未结婚”、“中外科学研究”、“商品和服务”“研究生命起源”“当下雨天地面积水”“结婚的和尚未结婚的”“欢迎新老师生前来就餐”,检查对应的分词结果

三、实现代码

python">#my_dic为自定义字典,内容可更改
my_dic = ["项目", "研究", "目的", "商品", "服务", "和服", "和尚", "尚未", "生命", "起源", "当下", "雨天", "地面", "积水", "下雨天", "欢迎", "老师", "生前", "就餐", "迎新", "师生", "前来"];

#在双向匹配中调用,用于比较列表元素位置
def select_word(text):
    result = 0
    for i in text:
        if (len(i) == 1):
            result += 1
    return result

#在main函数中调用,将输入数据初始化为列表数据
def fully_segment(text, dic):
    word_list = []
    for i in range(len(text)):
        for j in range(i + 1, len(text) + 1):
            word = text[i:j]
            if word in dic:
                word_list.append(word)
    return word_list

#正向最大匹配
def positive_max_match(text, dict):
    word_list = []
    i = 0
    while(i<len(text)):
        longest_word = text[i]
        for j in range(i+1, len(text) + 1):
            #从字典里开始找词,如果找到,先记录,如果有更长的,保存,直到遍历结束
            word = text[i:j]
            if word in dict:
                if len(word) > len(longest_word):
                    longest_word = word

        word_list.append(longest_word)
        i += len(longest_word)
    return word_list

#逆向最大匹配
def backward_segment(text, dict):
    word_list = []
    i = len(text) - 1
    while (i >= 0):
        longest_word = text[i]
        for j in range(0, i):
            word = text[j:i + 1]
        if word in dict:
            if len(word) > len(longest_word):
                longest_word = word
        word_list.insert(0, longest_word)
        i -= len(longest_word)
    return word_list

#双向最大匹配
def all_segment(text, dic):
    list_forward = positive_max_match(text, dic)
    list_backward = backward_segment(text, dic)
    list_final = []
    if (len(list_forward) > len(list_backward)):
        list_final = list_backward[:]
    elif (len(list_forward) < len(list_backward)):
        list_final = list_forward[:]
    else:
        if (select_word(list_forward) > select_word(list_backward)):
            list_final = list_backward[:]
        elif (select_word(list_forward) < select_word(list_backward)):
           list_final = list_forward[:]
        else:
           list_final = list_backward[:]
    return list_final

if __name__ == "__main__":
     #使用自定义词库进行分词练习
     while (1):
         a = input("请输入你要分词的句子:(输入0结束输入)")
         if (a == '0'):
             print("输入结束!")
             break
         b = fully_segment(a, my_dic)
         print("分词的结果", b)
         list_forward = positive_max_match(a, my_dic)
         list_backward = backward_segment(a, my_dic)
         list_all = all_segment(a, my_dic)
         print("正向最长匹配", list_forward)
         print("逆向最长匹配", list_backward)
         print("双向最长匹配", list_all)

2、使用jieba库进行中文分词、词组特性标注、关键词提取的相关方法 

一、实验内容

安装jieba分词库,并调用其中的分词、词组特性标注、关键词提取的相关方法,查看对应的功能。

二、实现步奏

1.安装jieba工具包:pip install jieba;

2.调用jieba分词功能:

seq_list = jieba.cut(“中外科学研究”,cut_all=True)

print(“全模式”+“/”.join(seq_list))

seq_list = jieba.cut(“中外科学研究”,cut_all=False)

print(“精确模式”+“/”.join(seq_list))

seq_list = jieba.cut_for_search(“中外科学研究”)

print(“全模式”+“/”.join(seq_list))

三、实现代码 

python">if __name__ == "__main__":
  # 使用jieba词库进行不同模式的分词,词性标注方法和关键字的提取
    seq_list = jieba.cut("中外科学研究", cut_all=True)
    print("全模式:" + "/".join(seq_list))
    seq_list = jieba.cut("中外科学研究", cut_all=False)
    print("精确模式:" + "/".join(seq_list))
    seq_list = jieba.cut_for_search("中外科学研究")
    print("搜索模式:" + "/".join(seq_list))

二、实现步奏

1.调用词性标注功能;

import jieba.posseg as psg

text=”去北京大学学习”

seg = psg.cut(text)

for ele in seg:

    print(ele)

三、代码实现 

python">import jieba.posseg as psg

if __name__ == "__main__":
    # 使用jieba词库进行不同模式的分词,词性标注方法和关键字的提取
    text = "去北京大学学习"
    seg = psg.cut(text)
    for ele in seg:
        print(ele)

http://www.niftyadmin.cn/n/5680980.html

相关文章

Java安全最佳实践:防御常见网络攻击

Java安全最佳实践&#xff1a;防御常见网络攻击 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在当今的网络环境中&#xff0c;应用程序面临着各种安全威胁。Java作为一种广泛使用的编程语言&…

spring-boot web + vue

依赖的软件 maven 1. 官网下载zip 文件&#xff0c;比如apache-maven-3.9.9-bin.zip 2. 解压到某个盘符&#xff0c;必须保证父亲目录的名字包含英文&#xff0c;数字&#xff0c;破折号&#xff08;-&#xff09; 3. 设置环境变量M2_HOME, 并将%M2_HOME%\bin添加到windown…

【java】前端RSA加密后端解密

目录 1. 说明2. 前端示例3. 后端示例3.1 pom依赖3.2 后端结构图3.3 DecryptHttpInputMessage3.4 ApiCryptoProperties3.5 TestController3.6 ApiCryptoUtil3.7 ApiDecryptParamResolver3.8 ApiDecryptRequestBodyAdvice3.9 ApiDecryptRsa3.10 ApiCryptoProperties3.11 KeyPair3…

mysql数据库项目

mysql数据库项目 如果对运维课程感兴趣,可以在b站上、csdn或微信视频号 上搜索我的账号: 运维实战课程,可以关注我,学习更多免费的运维实战技术视频 项目1 安装系统自带mysql服务,修改登录mysql数据库的默认登录密码,并在登录mysql数据库后对库的操作:查看当前已有库…

自定义knife4j访问路径

文章目录 本文档只是为了留档方便以后工作运维&#xff0c;或者给同事分享文档内容比较简陋命令也不是特别全&#xff0c;不适合小白观看&#xff0c;如有不懂可以私信&#xff0c;上班期间都是在得 原由&#xff0c;嫌弃doc.html 太大众 直接重定向&#xff0c;直接上代码了 p…

基于微信小程序的特色乡村综合展示平台设计与实现(源码+文档+讲解开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

死磕P7: JVM类加载那些事儿,一起探知类的前世今生(二)

这是「死磕P7」系列第 006 篇文章&#xff0c;欢迎大家来跟我一起 死磕 100 天&#xff0c;争取在 2025 年来临之际&#xff0c;给自己一个交代。 接上篇&#xff0c;上一篇介绍了 JVM 类加载过程及类的生命周期&#xff0c;回顾一下&#xff1a; 死磕P7: JVM类加载那些事儿&a…

Linux高级IO之poll与epoll

文章目录 poll使用 epoll系统调用 epoll的工作原理红黑树队列 epoll的工作模式水平触发边缘触发 Reactor设计模式工作原理epoll Reactor设计模式的简单示例 poll和epoll都是多路转接的调用&#xff0c;但是epoll实在过于优秀了&#xff0c;一般也都是用epoll的&#xff0c;除此…