【问题标题】:Use spacy on pretokenized text在预标记文本上使用 spacy
【发布时间】:2019-11-30 11:55:22
【问题描述】:

我想使用 spacy 来处理已经预先标记化的文本。将令牌列表解析为 spacy 不起作用。

import spacy
nlp = spacy.load("en_core_web_sm")
nlp(["This", "is", "a", "sentence"])

这给出了一个 TypeError(这是有道理的): TypeError: Argument 'string' has incorrect type (expected str, got list)

我可以用自定义的标记器替换标记器,但我觉得这会使事情变得过于复杂并且不是首选方式。

感谢您的帮助:D

【问题讨论】:

标签: python tokenize spacy


【解决方案1】:

你可以使用这个方法:

tokens = ["This", "is", "a", "sentence"]
sentence = nlp.tokenizer.tokens_from_list(tokens)
print(sentence)
This is a sentence 

【讨论】:

    【解决方案2】:

    如果你使用:

    sentence = nlp.tokenizer.tokens_from_list(tokens) 使用 spacy.matcher / Matcher 你会得到错误:

    尝试使用 nlp() 代替 nlp.make_doc() 或 list(nlp.pipe()) 列表的(nlp.tokenizer.pipe())。

    我解决它的方法:我在 for 循环中遍历每个项目:

    from spacy.matcher import Matcher
    matcher = Matcher(nlp.vocab)
    pattern = [{'LEMMA': 'sentence', 'POS': 'NOUN'}]
    matcher.add('Searched Word', None, pattern)
    X = ["Sentence one", "Sentence two", "Sentence three", "sentence last !"]
    for i in X.index:
        doc = nlp(X[i])
        matches = matcher(doc)
        for match_id, start, end in matches:
           matched_span = doc[start:end]
           print(matched_span.text)
    

    一个更好的方法是使用 nlp.pipe

    for doc in nlp.pipe(X):
    print([token.text for token in doc])
    

    也有利于更快的算法运行和更高效的文本处理。

    希望这会有所帮助。谢谢你。

    【讨论】:

      【解决方案3】:

      从 spaCy 3.0+ 开始,nlp.tokenizer.tokens_from_list() 已被弃用。请改用Doc 对象。

      import spacy
      from spacy.tokens import Doc
      nlp = spacy.load("en_core_web_sm")
      
      sent = ["This", "is", "a", "sentence"]
      
      doc = Doc(nlp.vocab, sent)
      for token in nlp(doc):
          print(token.text, token.pos_)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-10
        • 1970-01-01
        • 2022-08-14
        • 1970-01-01
        • 1970-01-01
        • 2022-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多