【问题标题】:how to use spacy lemmatizer to get a word into basic form如何使用 spacy lemmatizer 将单词转换为基本形式
【发布时间】:2016-12-10 07:42:24
【问题描述】:

我是 spacy 的新手,我想使用它的 lemmatizer 功能,但我不知道如何使用它,就像我进入单词字符串一样,它将以单词的基本形式返回字符串。

例子:

  • '单词'=>'单词'
  • '做过' =>'做'

谢谢。

【问题讨论】:

标签: python nltk spacy lemmatization


【解决方案1】:

上一个答案很复杂,无法编辑,所以这里是一个更传统的答案。

# make sure your downloaded the english model with "python -m spacy download en"

import spacy
nlp = spacy.load('en')

doc = nlp(u"Apples and oranges are similar. Boots and hippos aren't.")

for token in doc:
    print(token, token.lemma, token.lemma_)

输出:

Apples 6617 apples
and 512 and
oranges 7024 orange
are 536 be
similar 1447 similar
. 453 .
Boots 4622 boot
and 512 and
hippos 98365 hippo
are 536 be
n't 538 not
. 453 .

来自official Lighting tour

【讨论】:

  • @PhilipO'Brien 可能使用 python 2,但我在这里使用 python 3
  • 嗯,好的,对于 Python 2,我必须明确声明它是 unicode。谢谢! (我真的应该切换到 3!)
  • 这个问题的一个问题是任何代词都会被词形化为“-PRON-”,这很令人困惑。为什么不保留代词本身?
  • 搜索 '-PRON-' here 以查看解决方案,但我认为这不应该是默认行为。看起来很混乱。
  • 为什么apples仍然是apples,而其他复数形式却变成了单数?
【解决方案2】:

如果您只想使用 Lemmatizer,可以通过以下方式进行:

from spacy.lemmatizer import Lemmatizer
from spacy.lang.en import LEMMA_INDEX, LEMMA_EXC, LEMMA_RULES

lemmatizer = Lemmatizer(LEMMA_INDEX, LEMMA_EXC, LEMMA_RULES)
lemmas = lemmatizer(u'ducks', u'NOUN')
print(lemmas)

输出

['duck']

更新

自 spacy 2.2 版以来,LEMMA_INDEX、LEMMA_EXC 和 LEMMA_RULES 已捆绑到 Lookups 对象中:

import spacy
nlp = spacy.load('en')

nlp.vocab.lookups
>>> <spacy.lookups.Lookups object at 0x7f89a59ea810>
nlp.vocab.lookups.tables
>>> ['lemma_lookup', 'lemma_rules', 'lemma_index', 'lemma_exc']

您仍然可以直接将词形还原器与单词和 POS(词性)标签一起使用:

from spacy.lemmatizer import Lemmatizer, ADJ, NOUN, VERB

lemmatizer = nlp.vocab.morphology.lemmatizer
lemmatizer('ducks', NOUN)
>>> ['duck']

你可以像上面一样将 POS 标签作为导入的常量或字符串传递:

lemmatizer('ducks', 'NOUN')
>>> ['duck']

从 spacy.lemmatizer 导入 Lemmatizer、ADJ、名词、动词

【讨论】:

  • 我试过你的代码,但我得到一个错误,``` cannot import name 'LEMMA_INDEX' from 'spacy.lang.en'```
【解决方案3】:

代码:

import os
from spacy.en import English, LOCAL_DATA_DIR

data_dir = os.environ.get('SPACY_DATA', LOCAL_DATA_DIR)

nlp = English(data_dir=data_dir)

doc3 = nlp(u"this is spacy lemmatize testing. programming books are more better than others")

for token in doc3:
    print token, token.lemma, token.lemma_

输出:

this 496 this
is 488 be
spacy 173779 spacy
lemmatize 1510965 lemmatize
testing 2900 testing
. 419 .
programming 3408 programming
books 1011 book
are 488 be
more 529 more
better 615 better
than 555 than
others 871 others

示例参考:here

【讨论】:

  • nlp = English(data_dir=data_dir) : data_dir = data_dir,这是什么意思,它们看起来一样。
  • 传递变量。 English() 方法采用参数 data_dir。所以你通过“data_dir = local_variable_name”。也可以是 d_dir = os.environ.get('SPACY_DATA', LOCAL_DATA_DIR) nlp = English(data_dir=d_dir) 它只是基本的 python 东西。
  • 好的,我试试这些。
  • 这给出了当前版本 (2.2) 中的ModuleNotFoundError: No module named 'spacy.en'
【解决方案4】:

我使用 Spacy 版本 2.x

import spacy
nlp = spacy.load('en_core_web_sm', disable=['parser', 'ner'])
doc = nlp('did displaying words')
print (" ".join([token.lemma_ for token in doc]))

和输出:

do display word

希望对你有帮助:)

【讨论】:

  • 只使用标记器组件是个好主意!这有时会产生很大的影响并提高加载速度。
【解决方案5】:

我用过:

import spacy

nlp = en_core_web_sm.load()
doc = nlp("did displaying words")
print(" ".join([token.lemma_ for token in doc]))
>>> do display word

但它返回了

OSError: [E050] Can't find model 'en_core_web_sm'. It doesn't seem to be a shortcut link, a Python package or a valid path to a data directory.

我用过:

pip3 install https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.2.0/en_core_web_sm-2.2.0.tar.gz

摆脱错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 2021-09-16
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多