当前位置: 首页 > 面试题库 >

为什么pos_tag()如此缓慢,却可以避免?

陆伟
2023-03-14
问题内容

我希望能够以这种方式一个接一个地获取句子的POS标签:

def __remove_stop_words(self, tokenized_text, stop_words):

    sentences_pos = nltk.pos_tag(tokenized_text)  
    filtered_words = [word for (word, pos) in sentences_pos 
                      if pos not in stop_words and word not in stop_words]

    return filtered_words

但是问题是pos_tag()每个句子大约需要一秒钟。还有另一种选择可用于pos_tag_sents()批量执行此操作并加快处理速度。但是,如果我能逐句地做这件事,我的生活会更轻松。

有没有办法更快地做到这一点?


问题答案:

对于NLTK
3.1版,里面nltk/tag/__init__.pypos_tag是这样定义的:

from nltk.tag.perceptron import PerceptronTagger
def pos_tag(tokens, tagset=None):
    tagger = PerceptronTagger()
    return _pos_tag(tokens, tagset, tagger)

因此,每次对pos_tagfirst的调用实例化PerceptronTagger都会花费一些时间,因为它涉及加载pickle文件。_pos_tag
只需调用tagger.tagwhentagsetNone。因此,您可以通过
一次 加载文件并调用tagger.tag自己而不是调用来节省一些时间pos_tag

from nltk.tag.perceptron import PerceptronTagger
tagger = PerceptronTagger() 
def __remove_stop_words(self, tokenized_text, stop_words, tagger=tagger):
    sentences_pos = tagger.tag(tokenized_text)  
    filtered_words = [word for (word, pos) in sentences_pos 
                      if pos not in stop_words and word not in stop_words]

    return filtered_words

pos_tag_sents使用与上述相同的技巧-实例化PerceptronTagger一次,然后调用_pos_tag多次。因此,使用上述代码,您将获得与重构和调用相当的性能提升pos_tag_sents

另外,如果stop_words列表很长,则可以通过stop_words设置以下设置节省一些时间:

stop_words = set(stop_words)

因为检查集合中的成员资格(例如pos not in stop_words)是一项O(1)(恒定时间)操作,而检查列表中的成员资格是一项O(n)操作(即,它需要的时间与列表的长度成比例地增加)。



 类似资料:
  • 为了好玩,我决定用红宝石编码伊拉托西筛子。只是为了好玩,因为我知道有一个库函数。而且,我认为它会很快。但我发现它并不是,至少在我的ruby 1.9.3中,我的上网本速度快了好几倍,甚至在c中也没有。为什么会这样呢。 库实现: 我在红宝石: 图书馆非常慢。

  • 在对实际应用程序进行基准测试时,我遇到了一个与Delphi附带的zlib和zip库相关的令人惊讶的性能特性。 我使用Explorer shell ZIP功能压缩了同一个文件,我粗略的秒表计时是8秒,所以上面的32位时间似乎是合理的。 由于上面代码使用的压缩算法是zlib(Delphi的邮政编码只支持store和deflate),所以我的信念是Delphi使用的zlib库才是这个问题的根源。为什么d

  • 我正在维护一个Julia库,其中包含一个函数,用于在长字符串中每80个字符后插入一行新行。 当字符串长度超过100万个字符时,此函数将变得非常慢(秒或更长)。时间的增长似乎不仅仅是线性的,可能是二次的。我不明白为什么。有人能解释一下吗? 这是一些可复制的代码: 似乎这一行是大部分时间花费的地方: 这是否意味着初始化一个新的需要很长时间?这并不能真正解释超线性运行时间。 我知道构建字符串的标准快速方

  • 这与 R- 查看具有任何 NA 的所有列名称有关 我比较了data.frame和data.table版本,发现data.table慢了10倍。这与大多数使用data.table的代码相反,后者确实比data.frame版本快得多。 预先设置: 可能是什么原因?

  • 问题内容: 是因为我们应该加载类(例如),创建实例,然后搜索适当的方法,打包参数,然后仅调用方法?因此,大多数时间都花在了这些操作上,而不是花在对象上的显式方法调用上,对吧? 问题答案: 使用反射时,每次执行时都需要验证您执行的每个步骤。例如,当您调用一个方法时,它需要检查目标是否实际上是该方法的声明者的实例,是否具有正确数量的参数,每个参数是否具有正确的类型,等等。 绝对没有内联或其他性能技巧的

  • 问题内容: 我有一些针对angularjs应用运行的简单的业力/茉莉单元测试。我使用最新版本的Chrome,并在WebStorm IDE中运行测试。 有时测试套件运行非常快(0.24秒) 有时,针对完全相同的代码的完全相同的测试套件运行非常缓慢(120秒) 我尝试了所有常识性修复。我在网上搜寻了一下,以发现我在做什么错。 为什么我的测试运行如此缓慢? 问题答案: 答案很简单。 我正在使用Chrom