自然语言处理(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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿勉要睡觉(原神启动版)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值