我想用Spacy
包实现词形还原。
这是我的代码:
regexp = re.compile( '(?u)\\b\\w\\w+\\b' )
en_nlp = spacy.load('en')
old_tokenizer = en_nlp.tokenizer
en_nlp.tokenizer = lambda string: old_tokenizer.tokens_from_list(regexp.findall(string))
def custom_tokenizer(document):
doc_spacy = en_nlp(document)
return [token.lemma_ for token in doc_spacy]
lemma_tfidfvect = TfidfVectorizer(tokenizer= custom_tokenizer,stop_words = 'english')
但是当我运行该代码时出现了此错误消息。
C:\Users\yu\Anaconda3\lib\runpy.py:193: DeprecationWarning: Tokenizer.from_list is now deprecated. Create a new Doc object instead and pass in the strings as the `words` keyword argument, for example:
from spacy.tokens import Doc
doc = Doc(nlp.vocab, words=[...])
"__main__", mod_spec)
我该如何解决这个问题?
答案 0 :(得分:0)
要自定义spaCy的标记生成器,您需要向其传递一个字典列表,这些字典指定需要自定义标记的单词以及应分割成的标记。以下是docs的示例代码:
from spacy.attrs import ORTH, LEMMA
case = [{"don't": [{ORTH: "do"}, {ORTH: "n't", LEMMA: "not"}]}]
tokenizer.add_special_case(case)
如果您这样做是因为您想要制作自定义 lemmatizer ,那么您最好直接创建自定义引理列表。您必须修改spaCy本身的语言数据,但格式非常简单:
"dustiest": ("dusty",),
"earlier": ("early",),
"earliest": ("early",),
"earthier": ("earthy",),
...
这些文件以here为英文。
答案 1 :(得分:0)
我认为您的代码运行正常,您只是获得DeprecationWarning
,这实际上并不是错误。
根据警告提供的建议,我认为您可以修改代码
en_nlp.tokenizer = lambda string: Doc(en_nlp.vocab, words = regexp.findall(string))
这应该可以正常运行而没有警告(今天在我的机器上运行)。