跳转到主要内容

嗯,这可不是一只普通的兔子。

项目描述

Caerbannog的兔子

嗯,这可不是一只普通的兔子 - 这是你所见过的最糟糕、最残忍、最坏脾气的啮齿动物!

——Tim the Enchanter

此模块是Vowpal Wabbit机器学习系统的高级接口。目前它依赖于wabbit_wappa模块进行低级交互,但力求提供一个更高级的面向对象接口。

目前可以从caerbannog导入3种类型的Rabbit

Rabbit

您的标准兔子实例。默认情况下使用管道运行Vowpal Wabbit

ActiveRabbit

以主动学习模式运行Vowpal Wabbit,使用TCP套接字

OfflineRabbit

初始化器期望的参数是fp,它是一个以‘wt’模式打开的文件。输入的教诲将被写入此文件以进行离线处理。

电影评论情感 - 使用caerbannog的主动学习演示

在此处导入相关模块。我们使用ActiveRabbit进行主动在线学习

from caerbannog import ActiveRabbit, Example
from itertools import islice
import random
import nltk
from nltk.corpus import movie_reviews

创建一个具有0.01主动温和度的主动兔子

rabbit = ActiveRabbit(loss_function='logistic', active_mellowness=0.01)
rabbit.start()

从NLTK电影评论语料库加载数据(注意,您需要先通过nltk.download()下载这些数据。对于每个文档,创建一个(document_words,category)元组,其中category是“pos”或“neg”,而document_words是从分词器中提取的单词列表。

documents = [(list(movie_reviews.words(fileid)), category)
              for category in movie_reviews.categories()
              for fileid in movie_reviews.fileids(category)]
random.shuffle(documents)
len(documents)
2000

特征提取函数。首先过滤掉所有非字母数字标记。然后使“w”命名空间包含评论中的所有单词;“n”包含文档单词的2-4个ngram。

def document_features(document_words):
    document_words = list(filter(str.isalnum, document_words))
    example = Example()
    example['w'].add_features(set(document_words))
    ngrams = set()
    for j in range(2, 5):
        ngrams.update('_'.join(i) for i in nltk.ngrams(document_words, j))

    example['n'].add_features(ngrams)
    return example

Vowpal Wabbit期望标签为-1和1的logistic二元分类器

def convert_sent(sent):
    return {'pos': 1, 'neg': -1}[sent]

转换情感值并提取特征。

examples = [ (convert_sent(sent), document_features(doc)) for (doc, sent) in documents ]

用前1500个示例进行训练,并保留剩余的示例以进行验证

teach, test = examples[:1500], examples[1500:]

教授过滤器。我们要求对每个示例进行预测;如果重要性超过1,我们将“标记”该示例并将其教授给分类器。我们重复分类40次以确保分类器有足够的时间调整权重。

taught = 0
predicted = 0
labelled = set()
for i in range(10):
    for sent, ex in teach:
        predicted += 1
        if rabbit.predict(example=ex).importance >= 1:
            rabbit.teach(label=sent, example=ex)
            taught += 1
            labelled.add(ex)

print("Predicted {}, taught {} (ratio {}). {} unique inputs labelled"
      .format(predicted, taught, taught/predicted, len(labelled)))
Predicted 15000, taught 1057 (ratio 0.07046666666666666). 1042 unique inputs labelled

使用测试集进行测试。对于每个正确标记的示例,增加计数器

correct = 0
for sent, ex in test:
    prediction = rabbit.predict(example=ex)
    if prediction.label == sent:
        correct += 1

print("{} inputs predicted. {} correct; ratio {}".format(len(test), correct, correct / len(test)))
500 inputs predicted. 418 correct; ratio 0.836

许可证

MIT许可证。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

caerbannog-0.1.tar.gz (5.1 kB 查看散列)

上传时间

由以下组织支持