AttributeError:“list”对象没有属性“lower”gensim

2024-03-29 10:57:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个文本文件中列出了10k个单词,如下所示:

十五国集团 KDN公司 C30A型 行动标准 空气刷 空气稀释

我正试图将它们转换为低大小写标记,并使用此代码对GenSim进行后续处理:

data = [line.strip() for line in open("C:\corpus\TermList.txt", 'r')]
texts = [[word for word in data.lower().split()] for word in data]

我得到了以下回电:

AttributeErrorTraceback (most recent call last)
<ipython-input-84-33bbe380449e> in <module>()
      1 data = [line.strip() for line in open("C:\corpus\TermList.txt", 'r')]
----> 2 texts = [[word for word in data.lower().split()] for word in data]
      3 
AttributeError: 'list' object has no attribute 'lower'

任何关于我做错了什么以及如何改正的建议,我将不胜感激!!!谢谢您!!


Tags: intxtfordatalinecorpusopenlower
3条回答

你做错的是,为一个列表(在你的例子中是数据)调用一个字符串方法(lower()

data = [line.strip() for line in open('corpus.txt', 'r')]

在将行作为列表项获取后,应该做的是

texts = [[words for words in sentences.lower().split()] for sentences in data]
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*********^^^^^^^^^^^^^^^^^^^^^^*********^^^^
#you should call lower on iter. value - in our case it is "sentences"

这会给你列表。每个列表包含组成行的小写单词。

$ tail -n 10 corpus.txt 
G15 KDN C30A Action Standard Air Brush Air Dilution
G15 KDN C30A Action Standard Air Brush Air Dilution
G15 KDN C30A Action Standard Air Brush Air Dilution
G15 KDN C30A Action Standard Air Brush Air Dilution
G15 KDN C30A Action Standard Air Brush Air Dilution
G15 KDN C30A Action Standard Air Brush Air Dilution
G15 KDN C30A Action Standard Air Brush Air Dilution
G15 KDN C30A Action Standard Air Brush Air Dilution
G15 KDN C30A Action Standard Air Brush Air Dilution
G15 KDN C30A Action Standard Air Brush Air Dilution


$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> data = [line.strip() for line in open('corpus.txt', 'r')]
>>> texts = [[words for words in sentences.lower().split()] for sentences in data]
>>> texts[:5]
[['g15', 'kdn', 'c30a', 'action', 'standard', 'air', 'brush', 'air', 'dilution'], ['g15', 'kdn', 'c30a', 'action', 'standard', 'air', 'brush', 'air', 'dilution'], ['g15', 'kdn', 'c30a', 'action', 'standard', 'air', 'brush', 'air', 'dilution'], ['g15', 'kdn', 'c30a', 'action', 'standard', 'air', 'brush', 'air', 'dilution'], ['g15', 'kdn', 'c30a', 'action', 'standard', 'air', 'brush', 'air', 'dilution']]
>>> 

当然你可以变平或者保持原样。

>>> flattened = reduce(lambda x,y: x+y, texts)
>>> flattened[:30]
['g15', 'kdn', 'c30a', 'action', 'standard', 'air', 'brush', 'air', 'dilution', 'g15', 'kdn', 'c30a', 'action', 'standard', 'air', 'brush', 'air', 'dilution', 'g15', 'kdn', 'c30a', 'action', 'standard', 'air', 'brush', 'air', 'dilution', 'g15', 'kdn', 'c30a']
>>> 

你需要

texts = [[word.lower() for word in line.split()] for line in data]

这段代码为data[... for line in data])中的每个line生成一个小写单词列表([word.lower() for word in line.split()])。每个strline将包含一个空格分隔的单词序列。line.split()将此序列转换为列表。并且word.lower()将每个单词转换为小写。

尝试:

data = [line.strip() for line in open("C:\corpus\TermList.txt", 'r')]
texts = [[word.lower() for word in text.split()] for text in data]

您试图将.lower()应用于数据,这是一个列表。
.lower()只能应用于字符串。

相关问题 更多 >