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

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

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

一、实验内容

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

二、实现步奏

(一)新建Python工程NLPExp01

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

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

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

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

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

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

三、实现代码

#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))

三、实现代码 

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)

三、代码实现 

import jieba.posseg as psg

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

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

相关文章:

  • 如何让手机ip变成动态
  • MySQL中Flashback(闪回)技术
  • Day18 Nim游戏
  • 2024140读书笔记|《作家榜名著:生如夏花·泰戈尔经典诗选》——你从世界的生命的溪流浮泛而下,终于停泊在我的心头
  • Flowable 构建后端服务(后端以及数据库搭建) Flowable Modeler 设计器搭建(前端)
  • MySQL数据库:SQL语言入门 【2】(学习笔记)
  • AI技术在爱奇艺视频搜索中的应用
  • 代理模式简介:静态代理VS与动态代理
  • 硬件设计基础之闲聊千兆以太网
  • 设计模式-PIMPL 模式
  • 【Webpack】publicPath
  • STM32F407ZGT6配置can信号
  • 游戏服务器如何有效地实现不同游戏模式和规则?
  • git clone或repo init 时报错:fatal: 协议错误:错误的行长度 xxx
  • 如何保护自己电脑以及服务器的ip地址
  • MyBatis——Plus
  • Python/大数据/机器识别毕业设计选题题目推荐
  • 在Ubuntu中实现图形用户界面(GUI)切和命令行界面(CLI)的切换
  • 计算机毕业设计之:基于微信小程序的诗词智能学习系统(源码+文档+解答)
  • 一站式自闭症全托服务,让孩子全面发展
  • react组件入门
  • java中的四种引用
  • 【高分系列卫星简介——高分辨率多模综合成像卫星】
  • 无人机飞手入伍当兵技术优势分析
  • Android中使用RecyclerView制作横向轮播列表及索引点
  • 前端基础知识汇总(一)