英语文本处理工具库——spaCy

spaCy的主要操作:

分词断句

import spacy
nlp = spacy.load('en')
doc = nlp('Hello World! My name is HanXiaoyang')
# 分词
for token in doc:
    print('"' + token.text + '"')
# 断句
for sent in doc.sents:
    print(sent)

每个token对象有着非常丰富的属性,如下的方式可以取出其中的部分属性。

doc = nlp("Next week I'll   be in Shanghai.")
for token in doc:
    print("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}".format(
        token.text,
        token.idx,
        token.lemma_,
        token.is_punct,
        token.is_space,
        token.shape_,
        token.pos_,
        token.tag_
    ))
输出结果如下:
Next    0   next    False   False   Xxxx    ADJ JJ
week    5   week    False   False   xxxx    NOUN    NN
I   10  -PRON-  False   False   X   PRON    PRP
'll 11  will    False   False   'xx VERB    MD
    15      False   True        SPACE   _SP
be  17  be  False   False   xx  VERB    VB
in  20  in  False   False   xx  ADP IN
Shanghai    23  shanghai    False   False   Xxxxx   PROPN   NNP
.   31  .   True    False   .   PUNCT   .

词性标注

doc = nlp("Next week I'll be in Shanghai.")
print([(token.text, token.tag_) for token in doc])
输出结果:
[('Next', 'JJ'), ('week', 'NN'), ('I', 'PRP'), ("'ll", 'MD'), ('be', 'VB'), ('in', 'IN'), ('Shanghai', 'NNP'), ('.', '.')]

组块分析

spaCy可以自动检测名词短语,并输出根(root)词,比如下面的"Journal",“piece”,“currencies”

doc = nlp("Wall Street Journal just published an interesting piece on crypto currencies")
for chunk in doc.noun_chunks:
    print(chunk.text, chunk.label_, chunk.root.text)

输出结果:
Wall Street Journal NP Journal
an interesting piece NP piece
crypto currencies NP currencies

命名实体识别

doc = nlp("Two years ago, I lived in my Beijing.")
for ent in doc.ents:
    print(ent.text, ent.label_)

输出结果:
Two years ago DATE
BeijingGPE

还可以用非常漂亮的可视化做显示:

from spacy import displacy
displacy.render(doc, style='ent', jupyter=True)

在这里插入图片描述

句法依存分析

doc = nlp('Wall Street Journal just published an interesting piece on crypto currencies')
 
for token in doc:
    print("{0}/{1} <--{2}-- {3}/{4}".format(
        token.text, token.tag_, token.dep_, token.head.text, token.head.tag_))
输出结果:
Wall/NNP <--compound-- Street/NNP
Street/NNP <--compound-- Journal/NNP
Journal/NNP <--nsubj-- published/VBD
just/RB <--advmod-- published/VBD
published/VBD <--ROOT-- published/VBD
an/DT <--det-- piece/NN
interesting/JJ <--amod-- piece/NN
piece/NN <--dobj-- published/VBD
on/IN <--prep-- piece/NN
crypto/JJ <--compound-- currencies/NNS
currencies/NNS <--pobj-- on/IN

词向量

NLP中有一个非常强大的文本表示学习方法叫做word2vec,通过词的上下文学习到词语的稠密向量化表示,同时在这个表示形态下,语义相关的词在向量空间中会比较接近。也有类似v(爷爷)-v(奶奶) ≈ v(男人)-v(女人)的关系。
在spaCy中,要使用英文的词向量,需先下载预先训练好的结果。

python3 -m spacy download en_core_web_lg

词向量的应用:

nlp = spacy.load('en_core_web_lg')
from scipy import spatial

# 余弦相似度计算
cosine_similarity = lambda x, y: 1 - spatial.distance.cosine(x, y)

# 男人、女人、国王、女王 的词向量
man = nlp.vocab['man'].vector
woman = nlp.vocab['woman'].vector
queen = nlp.vocab['queen'].vector
king = nlp.vocab['king'].vector
 
# 我们对向量做一个简单的计算,"man" - "woman" + "queen"
maybe_king = man - woman + queen
computed_similarities = []

# 扫描整个词库的词向量做比对,召回最接近的词向量
for word in nlp.vocab:
    if not word.has_vector:
        continue
 
    similarity = cosine_similarity(maybe_king, word.vector)
    computed_similarities.append((word, similarity))

# 排序与最接近结果展示
computed_similarities = sorted(computed_similarities, key=lambda item: -item[1])
print([w[0].text for w in computed_similarities[:10]])

输出结果:
['Queen', 'QUEEN', 'queen', 'King', 'KING', 'king', 'KIng', 'Kings', 'KINGS', 'kings']

词汇与文本相似度

在词向量的基础上,spaCy提供了从词到文档的相似度计算的方法,下面的例子是它的使用方法。


# 词汇语义相似度(关联性)
banana = nlp.vocab['banana']
dog = nlp.vocab['dog']
fruit = nlp.vocab['fruit']
animal = nlp.vocab['animal']
 
print(dog.similarity(animal), dog.similarity(fruit)) # 0.6618534 0.23552845
print(banana.similarity(fruit), banana.similarity(animal)) # 0.67148364 0.2427285
# 文本语义相似度(关联性)
target = nlp("Cats are beautiful animals.")
 
doc1 = nlp("Dogs are awesome.")
doc2 = nlp("Some gorgeous creatures are felines.")
doc3 = nlp("Dolphins are swimming mammals.")
 
print(target.similarity(doc1))  # 0.8901765218466683
print(target.similarity(doc2))  # 0.9115828449161616
print(target.similarity(doc3))  # 0.7822956752876101
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Python,可以使用自然语言处理工具NLTK(Natural Language Toolkit)或者spaCy来计算句子之间的相似度。这里简单介绍一下使用NLTK计算句子相似度的方法。 NLTK提供了多种用于计算文本相似度的算法,其最常用的是基于词袋模型的余弦相似度算法。该算法首先将两个句子分别转化为向量表示,然后计算这两个向量之间的余弦相似度。 下面是一个简单的示例代码,演示如何使用NLTK计算两个句子的相似度: ```python from nltk.corpus import stopwords from nltk.tokenize import word_tokenize from nltk import pos_tag from nltk.stem import WordNetLemmatizer from nltk import ne_chunk from nltk.metrics import * from string import punctuation def clean_text(text): # 去除标点符号 text = ''.join([c for c in text if c not in punctuation]) # 分词 tokens = word_tokenize(text) # 去除停用词 stop_words = set(stopwords.words('english')) tokens = [w for w in tokens if not w.lower() in stop_words] # 词形还原 lemmatizer = WordNetLemmatizer() tokens = [lemmatizer.lemmatize(w) for w in tokens] # 命名实体识别 ne_chunks = ne_chunk(pos_tag(tokens), binary=True) named_entities = set(' '.join(i[0] for i in ne) for ne in ne_chunks if isinstance(ne, nltk.tree.Tree)) return named_entities def cosine_similarity(text1, text2): # 清洗文本 named_entities1 = clean_text(text1) named_entities2 = clean_text(text2) # 构建词袋 all_words = list(set(named_entities1).union(set(named_entities2))) vector1 = [1 if w in named_entities1 else 0 for w in all_words] vector2 = [1 if w in named_entities2 else 0 for w in all_words] # 计算余弦相似度 return round(1 - cosine_distance(vector1, vector2), 2) ``` 在上面的代码,`clean_text()`函数用于清洗文本,并提取其的命名实体。`cosine_similarity()`函数则用于计算两个句子的相似度,其使用了NLTK的`cosine_distance()`函数来计算余弦相似度。 使用示例: ```python text1 = "I like to eat apples." text2 = "Apples are my favorite fruit." similarity_score = cosine_similarity(text1, text2) print(similarity_score) # 输出:0.29 ``` 注意,以上代码仅仅是一个简单的示例,实际应用需要根据具体场景对代码进行优化和改进。 ### 回答2: 在Python,可以使用自然语言处理如NLTK(Natural Language Toolkit)或者spaCy来判断句子之间的相似度。 首先,需要将句子进行分词处理。NLTK和spaCy都提供了现成的分词器,可以将句子拆分成单词或者词语。分词之后,可以通过去除停用词(如‘的’、‘了’等)来减少噪音。 然后,可以将每个单词转换为词向量表示。Word2Vec是一种常用的词向量模型,可以将单词映射为在向量空间的表示。可以使用已经训练好的Word2Vec模型,也可以根据自己的数据进行训练。 接下来,可以使用余弦相似度来衡量两个句子之间的相似度。余弦相似度将两个向量之间的夹角度量为0到1之间的一个值,数值越接近1代表相似度越高。 最后,根据相似度进行判断。可以设定一个阈值,当两个句子的相似度大于阈值时判断为相似,否则判断为不相似。 实现相似度判断的代码如下所示(使用NLTK和Word2Vec): ```python from nltk.tokenize import word_tokenize from gensim.models import Word2Vec from scipy import spatial # 加载Word2Vec模型 model = Word2Vec.load('word2vec_model') # 定义余弦相似度函数 def cosine_similarity(vec1, vec2): return 1 - spatial.distance.cosine(vec1, vec2) # 定义句子相似度判断函数 def sentence_similarity(sentence1, sentence2): # 分词 tokens1 = word_tokenize(sentence1) tokens2 = word_tokenize(sentence2) # 移除停用词 stop_words = set(['的', '了', '是', '在', ...]) # 自定义停用词 tokens1 = [w for w in tokens1 if not w in stop_words] tokens2 = [w for w in tokens2 if not w in stop_words] # 转换为词向量 vectors1 = [model.wv[word] for word in tokens1 if word in model.wv] vectors2 = [model.wv[word] for word in tokens2 if word in model.wv] # 计算平均向量 if len(vectors1) > 0 and len(vectors2) > 0: avg_vector1 = sum(vectors1) / len(vectors1) avg_vector2 = sum(vectors2) / len(vectors2) # 计算余弦相似度 similarity = cosine_similarity(avg_vector1, avg_vector2) return similarity else: return 0 # 测试 sentence1 = '我喜欢吃苹果' sentence2 = '苹果是我喜欢吃的水果' similarity = sentence_similarity(sentence1, sentence2) print('句子相似度:', similarity) ``` 请注意,具体的实现方法还要根据具体的需求和数据来进行调整和优化,例如可以考虑使用更复杂的模型(如BERT)或者加入其他特征来提高相似度判断的准确度。 ### 回答3: Python可以利用自然语言处理技术根据语义判断句子之间的相似度。在这个过程,可以使用一种称为词向量的技术,将句子转换为数值表示,这样可以更好地比较它们之间的相似度。 在python,我们可以使用一些常用的来实现这个目标。其最著名的是使用Word2Vec模型的gensim。通过使用预训练的Word2Vec模型,我们可以将每个句子单词转换为对应的词向量,然后将这些词向量求平均,得到整个句子的向量。接下来,我们可以使用余弦相似度或欧几里德距离等方法来比较不同句子之间的向量相似度。 除了gensim,还有其他一些可以用来计算句子之间的相似度,如spaCy和nltk。这些提供了一些现成的工具和算法来处理文本数据,并计算句子之间的相似度。 需要注意的是,因为语义判断是一个相对主观的过程,所以不同的模型和算法可能会有不同的结果。另外,如果使用基于预训练模型的方法,句子单词必须在训练模型的词汇表才能得到有效的词向量表示。 总结起来,Python可以利用词向量和不同的来判断句子之间的语义相似度。这些工具可以帮助我们更好地理解和比较文本数据,从而应用到各种自然语言处理任务

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值