Другой вариант - использовать 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 .
Лемматизатор WordNet действительно учитывает POS-тег, но не определяет его магическим образом:
>>> nltk.stem.WordNetLemmatizer().lemmatize('loving')
'loving'
>>> nltk.stem.WordNetLemmatizer().lemmatize('loving', 'v')
u'love'
Без POS-тега он предполагает, что все, что вы кормите, является существительное. Так что здесь он думает, что вы передаете ему существительное «любящий» (как в «сладкой любви»).
это понятнее и эффективнее, чем перечисление :
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)
Лучший способ устранить эту проблему - это посмотреть в 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
Надеюсь, это поможет.
Как расширение принятого ответа от @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))