使用带标记器的嵌套循环列表理解迭代 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
),因为这会导致混淆。
我正在尝试从语料库中获取大量数据样本,并确定有多少比例的标记是停用词。
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
),因为这会导致混淆。