yes minister

更新时间:2022-11-22 16:36:46 阅读: 评论:0


2022年11月22日发(作者:多彩的童年)

【NLP】spaCy笔记

⽬录

参考

spaCy实践

语法⽅⾯

准备⼯作

importspacy#读⼊Spacy软件包

rtEnglish

nlp=('en_core_web_sm')#让Spacy使⽤英语模型,将模型存储到变量nlp;注:anaconda中可以使⽤('en')但pycharm中⽆法使⽤,故修改

text="Thequel,Yes,PrimeMinister,ltherewere38episodes,allepisodende

doc=nlp(text)#⽤nlp模型分析⽂本,将结果命名为doc;doc看似与原⽂本没区别,实际上spacy在后台已经进⾏了很多分析

展⽰全部词例(token)

#1、展⽰全部词例(token)

fortokenindoc:

print('"'++'"')#输出形式:"for",注意引号的使⽤

只对前10个词例(token),输出token的索引值、词元、词性等

#2、只对前10个词例(token),输出token的索引值、词元、词性等

fortokenindoc[:10]:

print("{0}t{1}t{2}t{3}t{4}t{5}t{6}t{7}".format(

,#⽂本

,#索引值(即在原⽂中的定位)

_,#词元

_punct,#是否为标点符号

_space,#是否为空格

_,

_,#词性

_#标记

))

不再考虑全部词性,只关注⽂本中出现的实体(entity)词汇

#3、不再考虑全部词性,只关注⽂本中出现的实体(entity)词汇

:

print(,_)

spacy命名实体识别_超简例_结果

把⼀段⽂字拆解为语句(按.分隔)

#4、把⼀段⽂字拆解为语句(按.分隔)

:

print(nt)

#注意这⾥并不是列表类型,⽽是

#假设我们需要从中筛选出某⼀句话,需要先将其转化为列表

doc=list()

print('1',doc[0])

搞清其中每⼀个词例(token)之间的依赖关系

#下⾯要展⽰的功能,分析范围局限在第⼀句话

#将第⼀句抽取出来,并且重新⽤nlp模型处理,存⼊到新的变量newdoc中

newdoc=nlp(list()[0].text)

#搞清其中每⼀个词例(token)之间的依赖关系

fortokeninnewdoc:

print("{0}/{1}<--{2}--{3}/{4}".format(

,_,_,,_))

语义⽅⾯

我们利⽤的⼯具,叫做词嵌⼊(wordembedding)模型。

引⼊“词嵌⼊模型”的概念

使⽤spaCy的词嵌⼊模型查看单词对应的向量

nlp=('en_core_web_lg')#使⽤词嵌⼊模型,我们需要Spacy读取⼀个新的⽂件

print(['minister'].vector)#打印“minister”这个单词对应的向量取值

结果显⽰,单词⽤总长度为300的浮点数组成向量来表⽰。

Spacy读⼊的这个模型,是采⽤word2vec,在海量语料上训练的结果。

查看spacy的语义近似度判别能⼒

importspacy#读⼊Spacy软件包

nlp=('en_core_web_lg')#使⽤词嵌⼊模型,我们需要Spacy读取⼀个新的⽂件

#将4个变量,赋值为对应单词的向量表达结果

dog=["dog"]

cat=["cat"]

apple=["apple"]

orange=["orange"]

#看看“狗”和“猫”/“苹果”的相似度结果

print(rity(cat))#0.80168545

print(rity(apple))#0.26339024

#看来Spacy利⽤词嵌⼊模型,对语义有了⼀定的理解

scipy计算相似度的余弦函数

importspacy#读⼊Spacy软件包

nlp=('en_core_web_lg')#使⽤词嵌⼊模型,我们需要Spacy读取⼀个新的⽂件

dog=["dog"]

cat=["cat"]

apple=["apple"]

orange=["orange"]

#若计算词典中可能不存在的向量,Spacy⾃带的similarity()函数,就显得不够⽤了。

#从scipy中,找到相似度计算需要⽤到的余弦函数

ceimportcosine

print(1-cosine(,))#0.8875

#除了保留⼏位⼩数外,计算结果与Spacy⾃带的similarity()运⾏结果没有差别

#我们把它做成⼀个⼩函数,专门处理向量输⼊

defvector_similarity(x,y):

return1-cosine(x,y)

print(vector_similarity(,))#0.26339

计算guess_word取值(guess_word=king-queen+woman)

importspacy#读⼊Spacy软件包

nlp=('en_core_web_lg')#使⽤词嵌⼊模型,我们需要Spacy读取⼀个新的⽂件

#?-woman=king-queen,即guess_word=king-queen+woman

#编写下⾯函数,计算guess_word取值

defmake_guess_word(words):

[first,cond,third]=words

[first].[cond].vector+[third].vector

make_guess_word(['king','queen','woman'])

print(make_guess_word(['king','queen','woman']))#得⼀堆向量值

⽤上⾯计算的guess_word取值,与字典词语逐个核对近似性,打印最近似的10个候选词

importspacy#读⼊Spacy软件包

nlp=('en_core_web_lg')#使⽤词嵌⼊模型,我们需要Spacy读取⼀个新的⽂件

ceimportcosine

defvector_similarity(x,y):

return1-cosine(x,y)

#编写下⾯函数,计算guess_word取值

defmake_guess_word(words):

[first,cond,third]=words

[first].[cond].vector+[third].vector

make_guess_word(['king','queen','woman'])

defget_similar_word(words,scope=):

guess_word=make_guess_word(words)

similarities=[]

forwordinscope:

_vector:

continue

similarity=vector_similarity(guess_word,)

((word,similarity))#注意两层(),否则报错TypeError:append()takexactlyoneargument(2given)

similarities=sorted(similarities,key=lambdaitem:-item[1])

print([word[0].textforwordinsimilarities[:10]])

#尝试:#?-woman=king-queen,即guess_word=king-queen+woman

words=["king","queen","woman"]#输⼊右侧词序列

get_similar_word(words)#然后执⾏对⽐函数

#结果:['MAN','Man','mAn','MAn','MaN','man','mAN','WOMAN','womAn','WOman']

#尝试:?-England=Paris-London,即guess_word=Paris-London+England

words=["Paris","London","England"]#把这⼏个单词输⼊

get_similar_word(words)#让Spacy来猜

#结果:['france','FRANCE','France','Paris','paris','PARIS','EUROPE','EUrope','europe','Europe']

把⾼维度的词向量(300维)压缩到⼆维平⾯,并⽤TSNE可视化

#把词向量的300维的⾼空间维度,压缩到⼀张纸(⼆维)上,看看词语之间的相对位置关系。

importnumpyasnp

importspacy

text="Thequel,Yes,PrimeMinister,ltherewere38episodes,allepisodende

nlp=('en_core_web_lg')

doc=nlp(text)

embedding=([])#把词嵌⼊矩阵先设定为空。⼀会⼉慢慢填⼊

word_list=[]#需要演⽰的单词列表,也先空着

#再次让Spacy遍历texts,加⼊到单词列表中。注意这次我们要进⾏判断:如果是标点,丢弃;如果词汇已经在词语列表中,丢弃

#即若不是标点符号且不在词语列表,则保留

fortokenindoc:

ifnot(_punct)andnot(word_list):

word_()

print(word_list)#注意打印内容:word_list,若打印print(word_())>>>None

#把每个词汇对应的空间向量,追加到词嵌⼊矩阵中

forwordinword_list:

embedding=(embedding,[word].vector)

#此时嵌⼊矩阵的维度为(18900,):所有向量都被放在了⼀个长串上⾯。这显然不符合我们的要求

#我们将不同的单词对应的词向量,拆解到不同⾏上⾯去

embedding=e(len(word_list),-1)

print()#看看此时词嵌⼊矩阵的维度:(63,300)

ldimportTSNE#从scikit-learn软件包中,读⼊TSNE模块

tsne=TSNE()#建⽴⼀个同名⼩写的tsne,作为调⽤对象(tsne的作⽤,是把⾼维度的词向量(300维)压缩到⼆维平⾯上)

low_dim_embedding=_transform(embedding)#执⾏压缩转换过程,low_dim_embedding,就是63个词汇降低到⼆维的向量表⽰

#降维后的词向量可视化

asplt#绘图⼯具包

#下⾯这个函数,⽤来把⼆维向量的集合,绘制出来

defplot_with_labels(low_dim_embs,labels,filename=''):

asrtlow_dim_[0]>=len(labels),"Morelabelsthanembeddings"

(figsize=(18,18))#ininches

fori,labelinenumerate(labels):

x,y=low_dim_embs[i,:]

r(x,y)

te(label,

xy=(x,y),

xytext=(5,2),

textcoords='offtpoints',

ha='right',

va='bottom')

g(filename)

plot_with_labels(low_dim_embedding,word_list)

#可视化图在路径下,.pdf⽂件

本文发布于:2022-11-22 16:36:46,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/311.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:yes minister
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图