首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pickle加速sklearn/Machine Learning上的分类任务?

使用pickle加速sklearn/Machine Learning上的分类任务?
EN

Stack Overflow用户
提问于 2015-10-06 22:09:06
回答 2查看 532关注 0票数 1

我已经有一个分类器训练,我通过泡菜加载。我的主要疑问是,是否有任何可以加快分类任务的方法。每个文本(特征提取和分类)几乎需要1分钟,这正常吗?我应该继续多线程吗?

下面是一些代码片段,以了解整体流程:

代码语言:javascript
复制
for item in items:
    review = ''.join(item['review_body'])
    review_features = getReviewFeatures(review)
    normalized_predicted_rating = getPredictedRating(review_features)
    item_processed['rating'] = str(round(float(normalized_predicted_rating),1))

def getReviewFeatures(review, verbose=True):

    text_tokens = tokenize(review)

    polarity = getTextPolarity(review)

    subjectivity = getTextSubjectivity(review)

    taggs = getTaggs(text_tokens)

    bigrams = processBigram(taggs)
    freqBigram = countBigramFreq(bigrams)
    sort_bi = sortMostCommun(freqBigram)

    adjectives = getAdjectives(taggs)
    freqAdjectives = countFreqAdjectives(adjectives)
    sort_adjectives = sortMostCommun(freqAdjectives)

    word_features_adj = list(sort_adjectives)
    word_features = list(sort_bi)

    features={}
    for bigram,freq in word_features:
        features['contains(%s)' % unicode(bigram).encode('utf-8')] = True
        features["count({})".format(unicode(bigram).encode('utf-8'))] = freq

    for word,freq in word_features_adj:
        features['contains(%s)' % unicode(word).encode('utf-8')] = True
        features["count({})".format(unicode(word).encode('utf-8'))] = freq

    features["polarity"] = polarity
    features["subjectivity"] = subjectivity

    if verbose:
        print "Get review features..."    

    return features


def getPredictedRating(review_features, verbose=True):
    start_time = time.time()
    classifier = pickle.load(open("LinearSVC5.pickle", "rb" ))

    p_rating = classifier.classify(review_features) # in the form of "# star"
    predicted_rating = re.findall(r'\d+', p_rating)[0]
    predicted_rating = int(predicted_rating)

    best_rating = 5
    worst_rating = 1
    normalized_predicted_rating = 0
    normalized_predicted_rating = round(float(predicted_rating)*float(10.0)/((float(best_rating)-float(worst_rating))+float(worst_rating)))

    if verbose:
        print "Get predicted rating..."
        print "ML_RATING: ", normalized_predicted_rating
        print("---Took %s seconds to predict rating for the review---" % (time.time() - start_time)) 

    return normalized_predicted_rating
EN

回答 2

Stack Overflow用户

发布于 2015-10-06 23:28:33

NLTK是一个很棒的工具,也是自然语言处理的一个很好的起点,但如果像作者暗示的那样,速度很重要,那么它有时就不是很有用:

Python被称为“使用

进行计算语言学教学和工作的绝佳工具”,以及“一个与自然语言打交道的神奇的库”。

因此,如果您的问题仅仅在于工具包的分类器的速度,那么您必须使用其他资源,或者您必须自己编写分类器。

如果你想使用一个可能更快的分类器,Scikit可能会对你有帮助。

票数 1
EN

Stack Overflow用户

发布于 2015-10-07 01:43:10

看起来您使用dictionary来构建特征向量。我强烈怀疑问题就在那里。

正确的方法应该是使用numpy ndarray,在行上使用示例,在列上使用功能。所以,就像这样

代码语言:javascript
复制
import numpy as np
# let's suppose 6 different features = 6-dimensional vector
feats = np.array((1, 6))
# column 0 contains polarity, column 1 subjectivity, and so on..
feats[:, 0] = polarity
feats[:, 1] = subjectivity
# ....
classifier.classify(feats)

当然,在训练过程中,您必须使用相同的数据结构并遵守相同的约定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32972138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档