Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 加速SpaCy标记器_Python 3.x_Spacy - Fatal编程技术网

Python 3.x 加速SpaCy标记器

Python 3.x 加速SpaCy标记器,python-3.x,spacy,Python 3.x,Spacy,我正在使用SpaCy标记数以万计的文档。每个文档平均需要5秒左右的时间。关于如何加快标记器的速度有什么建议吗 一些补充资料: 输入文件是具有新行字符的文本文件 文件的平均大小约为400KB 每个输入文件的标记都会写入输出文件中的新行(不过,如果这有助于提高速度,我可以对此进行更改) 共有1655个单词 输出文件被馈送到fasttext 以下是我的代码: 从pathlib导入路径,PurePath 从时间导入时间 st=时间() nlp=en_core\u web\u sm.load(禁用=[

我正在使用SpaCy标记数以万计的文档。每个文档平均需要5秒左右的时间。关于如何加快标记器的速度有什么建议吗

一些补充资料:

  • 输入文件是具有新行字符的文本文件
  • 文件的平均大小约为400KB
  • 每个输入文件的标记都会写入输出文件中的新行(不过,如果这有助于提高速度,我可以对此进行更改)
  • 共有1655个单词
  • 输出文件被馈送到fasttext
以下是我的代码:

从pathlib导入路径,PurePath
从时间导入时间
st=时间()
nlp=en_core\u web\u sm.load(禁用=['ner','tagger','parser','textcat'])
p=Path('input_text/').glob('*.txt'))
files=['input_text/'+x.name表示p中的x,如果x.is_file()]
#nlp=spacy.load('en-core-web-sm')
stopwords_文件='stopwords.txt'
def getStopWords():
f=打开(停止字文件'r')
stopWordsSet=f.read()
返回stopWordsSet
stopWordsSet=getStopWords()
out\u file='token\u results.txt'
对于文件中的文件:
#打印(输出文件)
将open(file,encoding=“utf8”)作为f:
st_doc=时间()
对于f中的行:
doc=nlp(行)
对于文档中的令牌:
如果(不是StopWordSet中的token.text.lower())
而不是token.is_punt而不是token.is_space而不是token.like_num
和len(token.shape)>1):
tup=(token.text,“|”,token.lemma|)
appendFile=open(输出文件'a',encoding=“utf-8”)
appendFile.write(“+tup[0]”)
打印((time()-st_doc),“秒数”,文件)
appendFile.write(“\n”)
appendFile.close()
打印((time()-st)/60,‘弹性分钟’)
  • 主要问题是:打开输出文件一次,直到脚本结束。反复关闭和重新打开,并寻找一个越来越大的文本文件的结尾将是非常缓慢的

  • 将停止字读入实际的
    set()
    。否则,您将在包含整个文件的长字符串中搜索每个标记,这会意外地匹配部分单词,并且比检查集合成员身份慢得多

  • 使用nlp.pipe()或仅使用nlp.tokenizer.pipe()进行标记化,以稍微加快spacy部分的速度。对于一堆简短的一句话文档来说,这似乎没有太大的区别。将一个大文档标记化要比将每一行作为单个文档处理快得多,但是否要这样做取决于数据的结构。如果只是标记化,如果需要,可以增加最大文档大小(
    nlp.max_length

  • texts = f.readlines()
    docs = nlp.tokenizer.pipe(texts)
    
    for doc in docs:
        for token in doc:
            ...