首页 > 解决方案 > 有没有一种快速的方法来获取 spaCy 中每个句子的标记?

问题描述

要将我的句子分成标记,我正在执行以下操作,这很慢

 import spacy nlp = spacy.load("en_core_web_lg")

 text = "This is a test. This is another test"

 sentence_tokens = []
 doc = nlp(text) 
 for sent in doc.sents:
     words = nlp(sent.text)
     all = []
     for w in words:
         all.append(w)
         sentence_tokens.append(all)

我有点想按照 nltk 处理它的方式来执行此操作,您可以使用将文本拆分为句子sent_tokenize(),然后为每个句子运行word_tokenize()

标签: spacy

解决方案


您的方法的主要问题是您要处理所有内容两次。一个句子 indoc.sents是一个Span对象,即Tokens 的序列。因此,无需再次调用nlp句子文本 - spaCy 已经在后台为您完成了所有这些,并且Doc您返回的内容已经包含您需要的所有信息。

因此,如果您需要一个字符串列表,每个标记一个,您可以执行以下操作:

sentence_tokens = []
for sent in doc.sents:
    sentence_tokens.append([token.text for token in sent])

甚至更短:

sentence_tokens = [[token.text for token in sent] for sent in doc.sents]

如果您正在处理大量文本,您可能还希望使用nlp.pipe它来提高效率。这将批量处理文本并生成Doc对象。你可以在这里阅读更多关于它的信息。

texts = ["Some text", "Lots and lots of texts"]
for doc in nlp.pipe(texts):
   sentence_tokens = [[token.text for token in sent] for sent in doc.sents]
   # do something with the tokens 

推荐阅读