gpt4 book ai didi

python - 使用 Scikit Learn 进行 Unigram 分析

转载 作者:太空宇宙 更新时间:2023-11-04 05:56:49 26 4
gpt4 key购买 nike

我正在尝试对 Sci Kit Learn 中的 unigrams 进行一些分析。我创建了 svmlight 格式的文件并尝试运行 MultinomialNB() KNeighborsClassifier() 和 SVC()。我们首先尝试使用 unigrams 来做到这一点,我得到了一个 X 训练维度错误,这大概是因为给定示例中包含的唯一 unigrams 是出现在适合那里的训练中的那些。我尝试创建 svmlight 格式的训练文件,其中包括语料库中每个看到的 unigram 的占位符,即使那些不在给定示例中的也是如此。

问题是训练文件从 3 MB 膨胀到 300 MB。这导致 sklearn 加载文件时出现内存错误。有没有办法解决维度不匹配或内存溢出的问题。

X_train, y_train= load_svmlight_file(trainFile)
x_test, y_test = load_svmlight_file(testFile)
try:
clf = MultinomialNB()
clf.fit(X_train, y_train)
preds = clf.predict(x_test)
print('Input data: ' + trainFile.split('.')[0])
print('naive_bayes')
print('accuracy: ' + str(accuracy_score(y_test, preds)))
if 1 in preds:
print('precision: ' + str(precision_score(y_test, preds)))
print('recall: ' + str(recall_score(y_test, preds)))
except Exception as inst:
print 'fail in NB ' + 'Input data: ' + trainFile.split('.')[0]
print str(inst)
pass

2828 个测试示例和 1212 个测试示例,具有 18000 个不同的 unigram

编辑 我尝试使用 sklearn CountVectorizer 但我仍然遇到内存问题。这是最好的方法吗?

def fileLoadForPipeline(trainSetFile, valSetFile):
with open(trainSetFile) as json_file:
tdata = json.load(json_file)
with open(valSetFile) as json_file:
vdata = json.load(json_file)
x_train = []
x_val = []
y_train = []
y_val = []
for t in tdata:
x_train.append(t['request_text'])
y_train.append(t['requester_received_pizza'])
for v in vdata:
x_val.append(t['request_text'])
y_val.append(t['requester_received_pizza'])
return x_train, y_train, x_val, y_val

def buildPipeline(trainset, valset, norm):
x_train, y_train, x_val, y_val = fileLoadForPipeline(trainset, valset)
bigram_vectorizer = CountVectorizer(ngram_range=(1, 2), token_pattern=ur'\b\w+\b', min_df=1)
xT = bigram_vectorizer.fit_transform(x_train).toarray()
xV = bigram_vectorizer.fit_transform(x_val).toarray()
if norm:
transformer = TfidfTransformer()
xT = transformer.fit_transform(xT)
xV = transformer.fit_transform(xV)
results = []
for clf, name in ((Perceptron(n_iter=50), "Perceptron"),
(KNeighborsClassifier(n_neighbors=40), "kNN"), (MultinomialNB), (MultinomialNB(alpha=.01),'MultinomialNB'),
(BernoulliNB(alpha=.1),'BernoulliNB'),(svm.SVC(class_weight='auto'),'svc')):
print 80 * '='
print name
results.append(benchmark(clf))

最佳答案

尝试使用 scikit-learn 的 CountVectorizer它将为您对原始文本进行特征提取。最重要的是,在一组训练示例上调用的方法 fit_transform 将自动进行词袋 unigram 转换,它跟踪在训练中找到的所有 n 个唯一单词语料库,并将每个文档转换为长度为 n 的数组,其特征可以是离散字数或二进制存在特征(取决于 binary 选项)。 CountVectorizer 的伟大之处在于它以 numpy 稀疏矩阵格式存储数据,这使得它的内存效率非常高,应该能够解决您遇到的任何内存问题。

然后您可以在以后的测试示例中调用transform,它会像往常一样进行转换。

这也应该有助于解决任何维度问题,因为 CountVectorizer 的工作是对所有内容进行正则化。具体使用信息在这里:

http://scikit-learn.org/stable/modules/feature_extraction.html#common-vectorizer-usage

这样做的另一个好处是,您可以使用 Pipeline 将此矢量化器与分类器结合起来。让验配和测试更方便。

关于python - 使用 Scikit Learn 进行 Unigram 分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27337438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com