当前位置:
首页 > temp > python入门教程 >
-
实现spaCy训练词性标注模型
词性标注是指为输入文本中的单词标注对应词性的过程。词性标注的主要作用在于预测接下来一个词的词性,并为句法分析、信息抽取等工作打下基础。通常地,实现词性标注的算法有HMM(隐马尔科夫)和深度学习(RNN、LSTM等)。然而,在中文中,由于汉语是一种缺乏词形态变化的语言,没有直接判断的依据,且常用词兼类现象严重,研究者主观原因造成的不同都给中文词性标注带来了很大的难点。
本文将介绍如何通过Python程序实现词性标注,并运用spaCy训练中文词性标注模型:
1、对训练集文本内容进行词性标注
首先,对于给定的训练集数据:
利用spaCy模块进行nlp处理,初始化一个标签列表和文本字符串,将文本分词后用“/”号隔开,并储存文本的词性标签到标签列表中,代码如下:
def train_data(train_path):
nlp = spacy.load('zh_core_web_sm')
train_list = []
for line in open(train_path,"r",encoding="utf8"):
train_list.append(line)
#print(train_list)
result = []
train_dict = {}
for i in train_list:
doc = nlp(i)
label = []
text = ""
#print(doc)
for j in doc:
text += j.text+"/"
#result.append(str(j.text))
#print(text)
label.append(j.pos_[0])
#print(result)
train_dict[j.pos_[0]] = {"pos":j.pos_}
#print(train_dict)
result.append((text[:-1],{'tags':label}))
return result,train_dict
大致会得到如下结果:
2、利用spaCy训练模型
然后,进行模型训练:
@plac.annotations(
lang=("ISO Code of language to use", "option", "l", str),
output_dir=("Optional output directory", "option", "o", Path),
n_iter=("Number of training iterations", "option", "n", int))
def main(lang='zh', output_dir=None, n_iter=25):
nlp = spacy.blank(lang) ##创建一个空的模型,en表示是英文的模型
tagger = nlp.add_pipe('tagger')
# Add the tags. This needs to be done before you start training.
for tag, values in train_dict.items():
print("tag:",tag)
print("values:",values)
#tagger.add_label(tag, values)
tagger.add_label(tag)
#tagger.add_label(values['pos'])
#nlp.create_pipe(tagger)
print("3:",tagger)
#nlp.add_pipe(tagger)
optimizer = nlp.begin_training() ##模型初始化
for i in range(n_iter):
random.shuffle(result) ##打乱列表
losses = {}
for text, annotations in result:
example = Example.from_dict(nlp.make_doc(text), annotations)
#nlp.update([text], [annotations], sgd=optimizer, losses=losses)
nlp.update([example], sgd=optimizer, losses=losses)
print(losses)
运行结果如下:
3、测试集验证模型
最后,同样过程处理测试数据:
代码如下:
test_path = r"E:\1\Study\大三下\自然语言处理\第五章作业\test.txt"
test_list = []
for line in open(test_path,"r",encoding="utf8"):
test_list.append(line)
for z in test_list:
txt = nlp(z)
test_text = ""
for word in txt:
test_text += word.text+"/"
print('test_data:', [(t.text, t.tag_, t.pos_) for t in txt])
# save model to output directory
if output_dir is not None:
output_dir = Path(output_dir)
if not output_dir.exists():
output_dir.mkdir()
nlp.to_disk(output_dir)
print("Saved model to", output_dir)
# test the save model
print("Loading from", output_dir)
nlp2 = spacy.load(output_dir)
doc = nlp2(test_text)
print('Tags', [(t.text, t.tag_, t.pos_) for t in doc])
验证结果如下:
文章出处:
https://www.cnblogs.com/Ukiii/p/14710202.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数