Выполнить итерацию 2 объектов с помощью понимания списка вложенных циклов с помощью токенизаторов - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь получить большую выборку данных из корпуса и установить, какая часть токенов является стоп-словами.

from sussex_nltk.corpus_readers import MedlineCorpusReader
from nltk.corpus import stopwords

mcr = MedlineCorpusReader()
sample_size = 10000
stopwords = stopwords.words('english')

raw_sentences = mcr.sample_raw_sents(sample_size)
tokenised_sentences = [word_tokenize(sentence) for sentence in raw_sentences]

filter_tok=[[sentence.isalpha() for sentence in sentence and sentence not in stopwords] for sentence in tokenised_sentences]

raw_vocab_size = vocabulary_size(tokenised_sentences)
filter_vocab_size = vocabulary_size(filter_tok)
print("Stopwords produced a {0:.2f}% reduction in vocabulary size from {1} to {2}".format(
    100*(raw_vocab_size - filter_vocab_size)/raw_vocab_size,raw_vocab_size,filter_vocab_size))  

Хотя даже после того, как я токенизировал свой список, я все еще не могу пройти через него.Поверьте, проблема кроется в строке 11, хотя я не уверен, как перебирать 2 разных объекта, как .isalpha (), так и стоп-слова.

1 Ответ

0 голосов
/ 24 ноября 2018

Я очень мало знаю о библиотеках, которые вы используете, но я кое-что знаю о списках.Правильный синтаксис:

[element for element in iterable if condition]

Но вы использовали

[element for element in iterable and condition]

Итак, Python интерпретировал iterable and condition (или в вашем примере sentence and sentence not in stopwords) как одно выражение.Результат является логическим и не повторяемым, поэтому он вызывает ошибку TypeError.

Просто замените and на if, и это, вероятно, будет работать.В противном случае правильное понимание вложенного списка.Я просто не рекомендовал бы иметь одно и то же имя для элемента и итерируемого (sentence), потому что это может привести к путанице.

...