как я могу написать для оператора таким образом: для i не в x

#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))]