有没有一种快速的方法来获取 spaCy 中每个句子的标记?

ero*_*las 4 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)
Run Code Online (Sandbox Code Playgroud)

我有点想用 nltk 处理它的方式来做这件事,你将文本拆分成句子sent_tokenize(),然后使用每个句子运行word_tokenize()

Ine*_*ani 7

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

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

sentence_tokens = []
for sent in doc.sents:
    sentence_tokens.append([token.text for token in sent])
Run Code Online (Sandbox Code Playgroud)

或者更短:

sentence_tokens = [[token.text for token in sent] for sent in doc.sents]
Run Code Online (Sandbox Code Playgroud)

如果您正在处理大量文本,您可能还想使用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 
Run Code Online (Sandbox Code Playgroud)