这是我的python代码:
import spacy
nlp = spacy.load('en')
line = u'Algorithms; Deterministic algorithms; Adaptive algorithms; Something...'
line = line.lower()
print ' '.join([token.lemma_ for token in nlp(line)])
输出结果为:
algorithm ; deterministic algorithm ; adaptive algorithms ; something...
为什么第三个algorithms
未转换为'算法'?
当我删除lower()
函数时,我得到了这个:
algorithms ; deterministic algorithms ; adaptive algorithm ; something...
这次无法转换第一个和第二个algorithms
。
这个问题让我发疯,我怎样才能解决这个问题,让每一个单词都被搞错?
答案 0 :(得分:2)
您使用的是哪个版本?使用lower
它可以正常使用我:
>>> doc = nlp(u'Algorithms; Deterministic algorithms; Adaptive algorithms; Something...'.lower())
>>> for word in doc:
... print(word.text, word.lemma_, word.tag_)
...
(u'algorithms', u'algorithm', u'NNS')
(u';', u';', u':')
(u'deterministic', u'deterministic', u'JJ')
(u'algorithms', u'algorithm', u'NNS')
(u';', u';', u':')
(u'adaptive', u'adaptive', u'JJ')
(u'algorithms', u'algorithm', u'NN')
(u';', u';', u':')
(u'something', u'something', u'NN')
(u'...', u'...', u'.')
如果没有lower
,标记器会为Algorithms
分配标记NNP,即专有名词。这可以防止这种类型化,因为模型在统计上已经猜到这个词是一个专有名词。
你可以在tokenizer中设置一个特殊情况规则来告诉spaCy Algorithms
永远不是一个专有名词,如果你愿意的话。
from spacy.attrs import POS, LEMMA, ORTH, TAG
nlp = spacy.load('en')
nlp.tokenizer.add_special_case(u'Algorithms', [{ORTH: u'Algorithms', LEMMA: u'algorithm', TAG: u'NNS', POS: u'NOUN'}])
doc = nlp(u'Algorithms; Deterministic algorithms; Adaptive algorithms; Something...')
for word in doc:
print(word.text, word.lemma_, word.tag_)
(u'Algorithms', u'algorithm', u'NNS')
(u';', u';', u':')
(u'Deterministic', u'deterministic', u'JJ')
(u'algorithms', u'algorithm', u'NN')
(u';', u';', u':')
(u'Adaptive', u'adaptive', u'JJ')
(u'algorithms', u'algorithm', u'NNS')
(u';', u';', u':')
(u'Something', u'something', u'NN')
(u'...', u'...', u'.')
tokenizer.add_special_case
函数允许您指定如何对字符串进行标记,并在每个子字符上设置属性。
答案 1 :(得分:0)
我认为syllogism_更好地解释了它。但这是另一种方式:
from nltk.stem import WordNetLemmatizer
lemma = WordNetLemmatizer()
line = u'Algorithms; Deterministic algorithms; Adaptive algorithms; Something...'.lower().split(';')
line = [a.strip().split(' ') for a in line]
line = [map(lambda x: lemma.lemmatize(x), l1) for l1 in line ]
print line
输出:
[[u'algorithm'], [u'deterministic', u'algorithm'], [u'adaptive', u'algorithm'], [u'something...']]