我正在尝试获取一个非常长的书籍数据库(大约 60,000 本书)中所有单词的 set() 并将每本书的“词汇表”存储在矩阵中(书籍的路径位于"file"中) ”):
for f in files:
book = open(f, 'r')
vocabulary = []
for lines in book.readlines():
words = string.split(lines)
vocabulary += set(words)
matrix.extend([vocabulary])
V += set(vocabulary)
好的,我通过创建一个文件来存储所有内容解决了(内存)问题,但现在在尝试使用以下命令创建矩阵时遇到另一个内存错误:
条目 = numpy.zeros((len(V),a))
我尝试通过以下方式解决这个问题:
entries = numpy.memmap('matrice.mymemmap', shape=(len(V),a))
但终端显示:
文件“/usr/lib/python2.7/dist-packages/numpy/core/memmap.py”,第 193 行,new fid = open(文件名, (模式 == 'c' 和 'r' 或模式)+'b') IOError:[Errno 2]没有这样的文件或目录:'matrice.mymemmap'
你能帮我解决这个问题吗?
最佳答案
V = set()
for f in files:
with open(f, 'r') as book:
for lines in book.readlines():
words = lines.split(" ")
V.update(words)
在这里,您首先创建一个空集。然后,对于每个文件,您迭代文件中的行并用空格分隔每一行。这将为您提供该行的单词列表。然后,您通过单词列表更新集合,即集合中仅保留唯一的单词。
所以,你最终会得到 V
其中包含您库中的所有单词。
当然,您可能想清理 words
中的一些大小写和标点符号。在更新集合之前删除空字( ""
)。这应该发生在 V.update()
之前陈述。否则,您最终会得到两者,例如 It
和it
, fortunately,
和fortunately
等
请注意with
带有文件操作的语句。这可以确保无论发生什么,文件都会在您离开 with block 之前关闭。
如果您想逐本书地进行此操作,那么:
vocabularies = []
for f in files:
V = set()
with open(f, 'r') as book:
for lines in book.readlines():
words = lines.split(" ")
V.update(words)
vocabularies.append(V)
另外,代替 for lines in book.readlines():
您可以只使用 for lines in book:
.
关于python - Set() 在一个很长的列表上并创建一个更长的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24655592/