使用带标记器的嵌套循环列表理解迭代 2 个对象

Iterate 2 objects with Nested Loop List Comprehension with Tokenisers

我正在尝试从语料库中获取大量数据样本,并确定有多少比例的标记是停用词。

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() 和停用词。

我对您使用的库知之甚少,但我对列表理解有所了解。正确的语法是

[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),因为这会导致混淆。