【问题标题】:Add/remove custom stop words with spacy使用 spacy 添加/删除自定义停用词
【发布时间】:2017-05-01 10:38:30
【问题描述】:

使用 spacy 添加/删除停用词的最佳方法是什么?我正在使用token.is_stop 函数并想对集合进行一些自定义更改。我正在查看文档,但找不到任何关于停用词的信息。谢谢!

【问题讨论】:

  • 完整列表:from spacy.en.word_sets import STOP_WORDS

标签: python nlp stop-words spacy


【解决方案1】:

对于版本 2.3.0 如果您想替换整个列表而不是添加或删除一些停用词,您可以这样做:

custom_stop_words = set(['the','and','a'])

# First override the stop words set for the language
cls = spacy.util.get_lang_class('en')
cls.Defaults.stop_words = custom_stop_words

# Now load your model
nlp = spacy.load('en_core_web_md')

诀窍是在加载模型之前为语言分配停用词集。它还确保停用词的任何大写/小写变体都被视为停用词。

【讨论】:

    【解决方案2】:

    这也收集了停用词:)

    spacy_stopwords = spacy.lang.en.stop_words.STOP_WORDS

    【讨论】:

      【解决方案3】:

      使用 Spacy 2.0.11,您可以使用以下方法之一更新其停用词集:

      添加单个停用词:

      import spacy    
      nlp = spacy.load("en")
      nlp.Defaults.stop_words.add("my_new_stopword")
      

      一次添加多个停用词:

      import spacy    
      nlp = spacy.load("en")
      nlp.Defaults.stop_words |= {"my_new_stopword1","my_new_stopword2",}
      

      要删除单个停用词:

      import spacy    
      nlp = spacy.load("en")
      nlp.Defaults.stop_words.remove("whatever")
      

      一次删除多个停用词:

      import spacy    
      nlp = spacy.load("en")
      nlp.Defaults.stop_words -= {"whatever", "whenever"}
      

      注意:要查看当前的停用词集,请使用:

      print(nlp.Defaults.stop_words)
      

      更新:在 cmets 中指出,此修复仅影响当前执行。要更新模型,您可以使用方法nlp.to_disk("/path")nlp.from_disk("/path")(在https://spacy.io/usage/saving-loading 中进一步描述)。

      【讨论】:

      • @AustinT 获得两个集合的并集是语法糖,a|=b 等价于a=a.union(b)。类似地,运算符-= 允许执行一组差异。花括号语法允许以简单的方式创建集合,a={1,2,3} 等同于a=set(1,2,3)
      • 这实际上并不影响模型。
      • 我的意思是它实际上似乎也不会影响当前的执行。 (也许我运行的东西出了问题。)另一种方法似乎万无一失。
      • 我同意@fny。虽然这会将停用词添加到 nlp.Defaults.stop_word,但如果您使用 token.is_stop 检查该词,您仍然会得到 False。
      【解决方案4】:

      在最新版本中,以下将删除列表中的单词:

      spacy_stopwords = spacy.lang.en.stop_words.STOP_WORDS
      spacy_stopwords.remove('not')
      

      【讨论】:

        【解决方案5】:

        对于 2.0,请使用以下内容:

        for word in nlp.Defaults.stop_words:
            lex = nlp.vocab[word]
            lex.is_stop = True
        

        【讨论】:

        • 您正在展示如何按照this bug/workaround 修复损坏的模型。虽然很容易适应 OP 需求,但您可以扩展为什么要以这种方式编写代码:由于错误,目前需要它,但这是一个多余的步骤,因为 les.is_stop 应该已经是 @987654324 @ 在没有错误的未来。
        【解决方案6】:

        您可以在像这样处理您的文本之前对其进行编辑(请参阅this post):

        >>> import spacy
        >>> nlp = spacy.load("en")
        >>> nlp.vocab["the"].is_stop = False
        >>> nlp.vocab["definitelynotastopword"].is_stop = True
        >>> sentence = nlp("the word is definitelynotastopword")
        >>> sentence[0].is_stop
        False
        >>> sentence[3].is_stop
        True
        

        注意:这似乎工作

        【讨论】:

        • 不错。谢谢!
        • 此解决方案似乎不再适用于 1.9.0 版?我收到TypeError: an integer is required
        • @E.K.错误的原因是因为词汇输入词应该是unicode(使用u“the”而不是“the”)
        【解决方案7】:

        对于 2.0 版,我使用了这个:

        from spacy.lang.en.stop_words import STOP_WORDS
        
        print(STOP_WORDS) # <- set of Spacy's default stop words
        
        STOP_WORDS.add("your_additional_stop_word_here")
        
        for word in STOP_WORDS:
            lexeme = nlp.vocab[word]
            lexeme.is_stop = True
        

        这会将所有停用词加载到一个集合中。

        您可以将停用词修改为STOP_WORDS 或首先使用您自己的列表。

        【讨论】:

        • 在 2.0 版中做到这一点并得到“ImportError: No module named en.stop_words”...suggestions?
        猜你喜欢
        • 2019-09-12
        • 2019-03-13
        • 2019-02-19
        • 2021-06-02
        • 2018-09-14
        • 2021-08-07
        • 1970-01-01
        • 2019-01-11
        • 1970-01-01
        相关资源
        最近更新 更多