#python #nltk
#python #nltk
Вопрос:
для классификации слов я определил положительные и отрицательные словари, и я хочу идентифицировать нейтральные слова (существует бесконечное количество нейтральных слов)
итак, я сделал это :
def word_feats(word):
return {word: True}
voc_pos = [ 'beauty', 'good', 'happy']
voc_neg = [ 'bad', 'sick','lazy']
voc = voc_pos voc_neg
pos_feats = [(word_feats(pos), 'pos') for pos in voc_pos]
neg_feats = [(word_feats(neg), 'neg')for neg in voc_neg]
neu_feats = [(word_feats(neu), 'neu')for neu not in voc]
ошибка :
"invalid syntax" for neu_feats = [(word_feats(neu), 'neu')for neu not in voc]
Комментарии:
1.
neu not in voc
это то, что вам нужно искать!2. [( {‘beauty’: True}, ‘pos’), ( {‘book’: True}, ‘neu’), ( {‘bad’: True}, ‘neg’)]
3. Там нет
book
.4. Не могли бы вы пояснить, зачем вам нужен список нейтральных слов и почему они структурированы в виде списка кортежей вместо словаря?
Ответ №1:
Продолжение ответа @ blue_note:
Используя zip_longest()
:
def word_feats(word):
return {word: True}
voc_pos = [ 'beauty', 'good', 'happy']
voc_neg = [ 'bad', 'sick','lazy']
voc = voc_pos voc_neg
mylist = ['book']
pos_feats = [(word_feats(pos), 'pos') for pos in voc_pos]
neu_feats = [(word_feats(neu), 'neu') for neu in mylist if neu not in voc]
neg_feats = [(word_feats(neg), 'neg') for neg in voc_neg]
print([*zip_longest(pos_feats, neu_feats, neg_feats)])
ВЫВОД:
[(({'beauty': True}, 'pos'), ({'book': True}, 'neu'), ({'bad': True}, 'neg')), (({'good': True}, 'pos'), None, ({'sick': True}, 'neg')), (({'happy': True}, 'pos'), None, ({'lazy': True}, 'neg'))]
Ответ №2:
Этот код недопустим:
for neu not in voc:
Причина в том, что список, который это могло бы создать, бесконечен!
Как говорит blue_note, вы можете сверить два списка друг с другом. Вы также могли бы сделать это с коллекциями вместо списков:
for neu in all_words - set(voc_pos) - set(voc_neg):
Где all_words — это какая-то другая коллекция, которую вы создали
Комментарии:
1. это работает, но мне нужно определить мой набор поездов следующим образом: train = pos_feats neg_feats neu_feats и all_words будут тестовой серией
Ответ №3:
for
работает с in
. not in
не является соединением not
и in
. Это отдельный оператор.
Итак, используйте понимание списка
[(word_feats(neu), 'neu') for neu in mylist if neu not in voc]
Комментарии:
1. это работает, но мне нужно определить мой набор поездов следующим образом: train = pos_feats neg_feats neu_feats, а mylist будет серией тестов
Ответ №4:
Вы не можете перебирать что-либо, чего нет в списке, потому что это было бы бесконечное (и неопределенное) множество.
Если вы определяете свой домен, например, все целые числа от 1 до 10, тогда вы можете выполнять итерации по элементам, которых нет в list lst, вот так:
domain = [1,2,3,4,5,6,7,8,9,10]
lst = [1,2,3]
# what you want:
neu = [(word_feats(neu), 'neu')for neu in (set(domain)-set(lst))]
Однако, я думаю, вам нужно решить это по-другому. Поскольку у вас вряд ли есть список всех существующих слов для создания этого списка, и с таким списком было бы сложно работать, возможно, было бы проще проверить, является ли слово нейтральным, проверив, нет ли его ни в pos_feats
, ни в neg_feats
?
Комментарии:
1. это работает, но мне нужно определить мой набор поездов следующим образом: train = pos_feats neg_feats neu_feats, и domain будет серией тестов
2. В этом случае также загрузите набор тестов, определите
domain=set(test_set) set(train_set)
, а затем вы можете использовать метод в моем ответе:neu = [(word_feats(neu), 'neu') for neu in (domain-set(neg_feats)-set(pos_feats))]