NLP基础:分词算法实战
1. 前向最大匹配法
1.1 加载词库
#加载词库,为减少索引的时间,词库的保存形式是字典,key为词, value是id
with open("././data/word2id.pkl", 'rb') as f:
dic_words = pickle.load(f)
print("Load vocabulary success!!")
1.2 前向最大匹配实现
def forward_max_matching(input_str, max_length):
"""
利用递归前向最大匹配分词
:param input_str :输入的字符串
:return :以“/”为分割符返回分词结果
"""
max_len = min(max_length, len(input_str))
# result = []
# if len(input_str) >= max_len:
if len(input_str) < 1:
return " "
else:
for end_index in range(max_len, 0, -1):
if input_str[:end_index] in dic_words:
return input_str[:end_index] + "/" + forward_max_matching(input_str[end_index:], max_length)
# 测试
print("forward_max_matching:{}".format(forward_max_matching("北京的天气真好啊", 5)[:-2]))
print("forward_max_matching:{}".format(forward_max_matching("今天的课程内容很有意思", 5)[:-2]))
print("forward_max_matching:{}".format(forward_max_matching("经常有意见分歧", 5)[:-2]))
1.3 前向最大匹配实现结果
Load vocabulary success!!
forward_max_matching:北京/的/天气/真好/啊
forward_max_matching:今天/的/课程/内容/很/有意思
forward_max_matching:经常/有意/见/分歧
Process finished with exit code 0
2. 后向最大匹配法
2.1 加载词库与实现
import pickle
#加载词库,为减少索引的时间,词库的保存形式是字典,key为词, value是id
with open("././data/word2id.pkl", 'rb') as f:
dic_words = pickle.load(f)
print("Load vocabulary success!!")
def backward_max_matching(input_str, max_length):
"""
利用递归实现后向最大匹配分词
:param input_str :输入的字符串
:return :以"/"为分隔符返回分词列表
"""
max_len = min(max_length, len(input_str))
if len(input_str) < 1:
return " "
else:
for end_index in range(-1 * max_len, 0):
word = input_str[end_index:]
if word in dic_words:
# result = result + [word] + backward_max_matching(input_str[:end_index])
return backward_max_matching(input_str[:end_index], max_length) + "/" + word
print("backward_max_matching:{}".format(backward_max_matching("北京的天气真好啊", 5)[2:]))
print("backward_max_matching:{}".format(backward_max_matching("今天的课程内容很有意思", 5)[2:]