我有一份文件清单,标有适当的类别:
documents = [(list(corpus.words(fileid)), category)
for category in corpus.categories()
for fileid in corpus.fileids(category)]
这给了我以下的元组列表,其中元组的第一个元素是一个单词列表(一个句子的标记).例如:
[([u'A', u'pilot', u'investigation', u'of', u'a', u'multidisciplinary',
u'quality', u'of', u'life', u'intervention', u'for', u'men', u'with',
u'biochemical', u'recurrence', u'of', u'prostate', u'cancer', u'.'],
'cancer'),
([u'A', u'Systematic', u'Review', u'of', u'the', u'Effectiveness',
u'of', u'Medical', u'Cannabis', u'for', u'Psychiatric', u',',
u'Movement', u'and', u'Neurodegenerative', u'Disorders', u'.'], 'hd')]
我想应用一些文本处理技术,但我希望保持元组格式列表.
我知道,如果我只有一个单词列表,那么这样做:
[w.lower() for w in words]
但在这种情况下,我想将.lower()应用于元组列表中每个元组的第一个元素(字符串列表),并在尝试各种选项后:
[[x.lower() for x in element] for element in documents],
[(x.lower(), y) for x,y in documents], or
[x[0].lower() for x in documents]
我总是得到这个错误:
AttributeError: ‘list’ object has no attribute ‘lower’
我也尝试在创建列表之前应用我需要的东西,但.categories()和.fileids()是语料库的属性,它们也返回相同的错误(它们也是列表).
任何帮助将深表感谢.
解决了:
@Adam Smith的答案和@vasia都是对的:
[([s.lower() for s in item[0]], item[1]) for item in documents]
@ Adam的答案保持了元组结构; @vasia从创建元组列表中做到了这一点:
documents = [([word.lower() for word in corpus.words(fileid)], category)
for category in corpus.categories()
for fileid in corpus.fileids(category)]
谢谢你们 :)
最佳答案 所以你的数据结构是[([str],str)].每个元组所在的元组列表(字符串列表,字符串).在尝试从中提取数据之前,深入了解这意味着什么是很重要的.
这意味着对于文档中的项目将获得元组列表,其中item是每个元组.
这意味着item [0]是每个元组中的列表.
这意味着对于文档中的项目:对于项目[0]中的s:将遍历该列表中的每个字符串.我们来试试吧!
[s.lower() for item in documents for s in item[0]]
这应该从您的示例数据中给出:
[u'a', u'p', u'i', u'o', u'a', u'm', ...]
如果你想保留元组格式,你可以这样做:
[([s.lower() for s in item[0]], item[1]) for item in documents]
# or perhaps more readably
[([s.lower() for s in lst], val) for lst, val in documents]
这两个陈述都给出了:
[([u'a', u'p', u'i', u'o', u'a', u'm', ...], 'cancer'), ... ]