自然语言处理(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)