NLTK WordNet Lemmatizer: Разве это не должно лемматизировать все склонения слова?

Другой вариант - использовать localizedStandardCompare: . Из документации:

Этот метод следует использовать всякий раз, когда имена файлов или другие строки представлены в списках и таблицах, где подходит сортировка по поисковому запросу.

blockquote>

Это отсортирует строки, соответствующие текущему языку. Пример:

let myArray = ["Step 6", "Step 12", "Step 10"]

let ans = sorted(myArray,{ (s1, s2) in 
    return s1.localizedStandardCompare(s2) == NSComparisonResult.OrderedAscending
})

println(ans)
// [Step 6, Step 10, Step 12]

Обновление: вышеупомянутый ответ довольно старый и для Swift 1.2. Версия Swift 3 (спасибо @Ahmad):

let ans = myArray.sorted {
    (s1, s2) -> Bool in return s1.localizedStandardCompare(s2) == .orderedAscending
}

Для другого подхода см. https://stackoverflow.com/a/31209763/1187415 , переведенный на Swift 3 в https://stackoverflow.com/a/39748677/1187415 .

29
задан Peter Mortensen 12 April 2015 в 15:24
поделиться

4 ответа

Лемматизатор WordNet действительно учитывает POS-тег, но не определяет его магическим образом:

>>> nltk.stem.WordNetLemmatizer().lemmatize('loving')
'loving'
>>> nltk.stem.WordNetLemmatizer().lemmatize('loving', 'v')
u'love'

Без POS-тега он предполагает, что все, что вы кормите, является существительное. Так что здесь он думает, что вы передаете ему существительное «любящий» (как в «сладкой любви»).

58
ответ дан Fred Foo 12 April 2015 в 15:24
поделиться

это понятнее и эффективнее, чем перечисление :

from nltk.corpus import wordnet

def get_wordnet_pos(self, treebank_tag):
    if treebank_tag.startswith('J'):
        return wordnet.ADJ
    elif treebank_tag.startswith('V'):
        return wordnet.VERB
    elif treebank_tag.startswith('N'):
        return wordnet.NOUN
    elif treebank_tag.startswith('R'):
        return wordnet.ADV
    else:
        return ''

def penn_to_wn(tag):
    return get_wordnet_pos(tag)
2
ответ дан Joe Zhow 12 April 2015 в 15:24
поделиться

Лучший способ устранить эту проблему - это посмотреть в Wordnet. Взгляните сюда: Loving in wordnet . Как вы можете видеть, на самом деле в Wordnet присутствует прилагательное «любящий». На самом деле, есть даже наречие «с любовью»: с любовью в Wordnet . Поскольку wordnet на самом деле не знает, какую часть речи вы на самом деле хотите, по умолчанию используется имя существительное ('n' в Wordnet). Если вы используете набор тегов Penn Treebank, вот несколько удобных функций для преобразования тегов Penn в WN:

from nltk.corpus import wordnet as wn

def is_noun(tag):
    return tag in ['NN', 'NNS', 'NNP', 'NNPS']


def is_verb(tag):
    return tag in ['VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ']


def is_adverb(tag):
    return tag in ['RB', 'RBR', 'RBS']


def is_adjective(tag):
    return tag in ['JJ', 'JJR', 'JJS']


def penn_to_wn(tag):
    if is_adjective(tag):
        return wn.ADJ
    elif is_noun(tag):
        return wn.NOUN
    elif is_adverb(tag):
        return wn.ADV
    elif is_verb(tag):
        return wn.VERB
    return None

Надеюсь, это поможет.

27
ответ дан bogs 12 April 2015 в 15:24
поделиться

Как расширение принятого ответа от @Fred Foo выше;

from nltk import WordNetLemmatizer, pos_tag, word_tokenize

lem = WordNetLemmatizer()
word = input("Enter word:\t")

# Get the single character pos constant from pos_tag like this:
pos_label = (pos_tag(word_tokenize(word))[0][1][0]).lower()

# pos_refs = {'n': ['NN', 'NNS', 'NNP', 'NNPS'],
#            'v': ['VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ'],
#            'r': ['RB', 'RBR', 'RBS'],
#            'a': ['JJ', 'JJR', 'JJS']}

if pos_label == 'j': pos_label = 'a'    # 'j' <--> 'a' reassignment

if pos_label in ['r']:  # For adverbs it's a bit different
    print(wordnet.synset(word+'.r.1').lemmas()[0].pertainyms()[0].name())
elif pos_label in ['a', 's', 'v']: # For adjectives and verbs
    print(lem.lemmatize(word, pos=pos_label))
else:   # For nouns and everything else as it is the default kwarg
    print(lem.lemmatize(word))
0
ответ дан 27 November 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: