spacy - 有没有一种快速的方法来获取 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()
解决方案
您的方法的主要问题是您要处理所有内容两次。一个句子 indoc.sents
是一个Span
对象,即Token
s 的序列。因此,无需再次调用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
推荐阅读
- android - 使用 WorkManager 在特定时间安排工作
- jenkins - 无法在 Jenkins 中将文件 'xxx-dist.tar' 添加到 TAR 'xxx-dist.tar'
- python - python: pandas.DataFrame,如何避免keyerror?
- java - 我想打印一个对象的 varValue 及其相关的评论对象。
- android - 科尔多瓦 | 当 Android 手机从睡眠中恢复时,应用程序无响应
- c# - 有没有办法通过过滤它的名字来自动杀死一个进程?
- java - 将图像发送到另一台服务器中的 MobileApp
- php - 无法使用php mysql通过数组和内爆函数将数据插入数据库
- django - Django:如何使用 APIClient 在单元测试用例中上传 csv 文件
- go - golang 的 GC 会释放仅由 goroutine 引用的对象的内存吗?