我将用Python实现朴素的Bayes分类器,并将电子邮件归类为垃圾邮件。我有一个非常稀疏和长的数据集,包含许多条目。每个条目如下:
1 9:3 94:1 109:1 163:1 405:1 406:1 415:2 416:1 435:3 436:3 437:4
其中1是标签(垃圾邮件,而不是垃圾邮件),每一对对应于一个单词及其频率。例如,9:3对应于单词9,在这个电子邮件示例中发生了3次。
我需要阅读这个数据集并将其存储在一个结构中。由于它是一个非常大且稀疏的数据集,所以我正在寻找一个整洁的数据结构来存储以下变量:
创建一个包含所有单词及其频率的语料库。
对这种数据结构有什么建议吗?
发布于 2011-09-17 11:09:08
我会生成一个类
class Document(object):
def __init__(self, index, label, bowdict):
self.index = index
self.label = label
self.bowdict = bowdict将稀疏向量存储在bowdict中,例如
{ 9:3, 94:1, 109:1, ... } 并将所有数据保存在Document的列表中。
若要获得具有给定标签的所有文档的聚合,请执行以下操作:
from collections import defaultdict
def aggregate(docs, label):
bow = defaultdict(int)
for doc in docs:
if doc.label == label:
for (word, counter) in doc.bowdict.items():
bow[word] += counter
return bow 您可以使用cPickle模块持久化所有数据。
另一种方法是使用http://docs.scipy.org/doc/scipy/reference/sparse.html。你可以用一行稀疏矩阵来表示一个弓形向量.如果你想聚合弓,你只需要把它们加起来。这可能比上面简单的解决方案要快得多。
此外,可以将所有稀疏文档存储在一个大型矩阵中,其中文档实例包含对矩阵的引用,以及关联行的行索引。
发布于 2011-09-17 07:06:20
如果您假设您不关心电子邮件中每个单词的多次出现,那么您真正需要知道的就是(也就是说,您的功能是布尔型的):
对于每一个特性,积极联想和消极联想的计数是多少?
您可以很容易地在网上一次通过,只跟踪这两个数字为每个功能。
非布尔型的特性意味着你必须以某种方式对这些特性进行离散化,但你并不是真的在问如何做到这一点。
发布于 2011-09-17 07:29:06
https://github.com/Yelp/sqlite3dbm
http://packages.python.org/sqlite3dbm/
这就像python字典,只是它将您给它的所有内容都存储在磁盘上,因此,它是持久的!这不会增加大量内存,因为它把东西写到磁盘上。您可以让一个程序设置这些文件,而另一个程序使用它们进行分类,而不必担心序列化问题。
您可以将第一个问题清晰地建模为
doc_to_info[doc_id] = {'label': 'label_0', 'word_freqs': {'this': 3, 'is': 4, ...}}您可以将第二个问题建模为
word_to_freq[word] = {'label_0': 42, 'label_1': 314}https://stackoverflow.com/questions/7452917
复制相似问题