我有一些二元组,比如说:[('word','word'),('word','word'),...,('word','word')]
。我如何使用scikit的HashingVectorizer
来创建一个特征向量,随后将其呈现给某些分类算法,例如SVC
或朴素贝叶斯或任何类型的分类算法?
回答:
首先,你必须理解不同的向量化器在做什么。大多数向量化器基于词袋
方法,其中文档中的词被映射到一个矩阵上。
根据sklearn的文档,CountVectorizer和HashVectorizer:
将一组文本文档转换为一个标记计数矩阵
例如,这些句子
富尔顿县大陪审团周五表示,对亚特兰大最近的初选选举的调查没有发现任何不规则行为的证据。
陪审团进一步在期末陈述中表示,负责选举的城市执行委员会“值得亚特兰大市的赞扬和感谢”,因为他们以这种方式进行了选举。
使用这个粗略的向量化器:
from collections import Counterfrom itertools import chainfrom string import punctuationfrom nltk.corpus import brown, stopwords# 假设训练/测试数据是一组单词和词性标注的列表sentences = brown.sents()[:2]# 提取内容词作为特征,即列。vocabulary = list(chain(*sentences))stops = stopwords.words('english') + list(punctuation)vocab_nostop = [i.lower() for i in vocabulary if i not in stops]# 从句子中创建一个矩阵matrix = [Counter([w for w in words if w in vocab_nostop]) for words in sentences]print matrix
将会变成:
[Counter({u"''": 1, u'``': 1, u'said': 1, u'took': 1, u'primary': 1, u'evidence': 1, u'produced': 1, u'investigation': 1, u'place': 1, u'election': 1, u'irregularities': 1, u'recent': 1}), Counter({u'the': 6, u'election': 2, u'presentments': 1, u'``': 1, u'said': 1, u'jury': 1, u'conducted': 1, u"''": 1, u'deserves': 1, u'charge': 1, u'over-all': 1, u'praise': 1, u'manner': 1, u'term-end': 1, u'thanks': 1})]
因此,考虑到非常大的数据集,这可能相当低效,所以sklearn
的开发者构建了更高效的代码。sklearn
的一个最重要的功能是你甚至不需要在向量化之前将数据集加载到内存中。
由于你的任务不明确,我认为你可能是在寻找一种通用用途。假设你用它来进行语言识别。
假设你的训练数据的输入文件在train.txt
中:
Pošto je EULEX obećao da će obaviti istragu o prošlosedmičnom izbijanju nasilja na sjeveru Kosova, taj incident predstavlja još jedan ispit kapaciteta misije da doprinese jačanju vladavine prava.De todas as provações que teve de suplantar ao longo da vida, qual foi a mais difícil? O início. Qualquer começo apresenta dificuldades que parecem intransponíveis. Mas tive sempre a minha mãe do meu lado. Foi ela quem me ajudou a encontrar forças para enfrentar as situações mais decepcionantes, negativas, as que me punham mesmo furiosa.Al parecer, Andrea Guasch pone que una relación a distancia es muy difícil de llevar como excusa. Algo con lo que, por lo visto, Alex Lequio no está nada de acuerdo. ¿O es que más bien ya ha conseguido la fama que andaba buscando?Vo väčšine golfových rezortov ide o veľký komplex niekoľkých ihrísk blízko pri sebe spojených s hotelmi a ďalšími možnosťami trávenia voľného času – nie vždy sú manželky či deti nadšenými golfistami, a tak potrebujú iný druh vyžitia. Zaujímavé kombinácie ponúkajú aj rakúske, švajčiarske či talianske Alpy, kde sa dá v zime lyžovať a v lete hrať golf pod vysokými alpskými končiarmi.
相应的标签是波斯尼亚语、葡萄牙语、西班牙语和斯洛伐克语,即
[bs,pt,es,sr]
这里是使用CountVectorizer
和朴素贝叶斯分类器的一种方法。以下示例来自https://github.com/alvations/bayesline的DSL共享任务。
让我们从向量化器开始。首先,向量化器接受输入文件,然后将训练集转换为一个向量化矩阵,并初始化向量化器(即特征):
import codecsfrom sklearn.feature_extraction.text import CountVectorizerfrom sklearn.naive_bayes import MultinomialNBtrainfile = 'train.txt'testfile = 'test.txt'# 向量化数据。train = []word_vectorizer = CountVectorizer(analyzer='word')trainset = word_vectorizer.fit_transform(codecs.open(trainfile,'r','utf8'))tags = ['bs','pt','es','sr']print word_vectorizer.get_feature_names()
[out]:
[u'acuerdo', u'aj', u'ajudou', u'al', u'alex', u'algo', u'alpsk\xfdmi', u'alpy', u'andaba', u'andrea', u'ao', u'apresenta', u'as', u'bien', u'bl\xedzko', u'buscando', u'come\xe7o', u'como', u'con', u'conseguido', u'da', u'de', u'decepcionantes', u'deti', u'dificuldades', u'dif\xedcil', u'distancia', u'do', u'doprinese', u'druh', u'd\xe1', u'ela', u'encontrar', u'enfrentar', u'es', u'est\xe1', u'eulex', u'excusa', u'fama', u'foi', u'for\xe7as', u'furiosa', u'golf', u'golfistami', u'golfov\xfdch', u'guasch', u'ha', u'hotelmi', u'hra\u0165', u'ide', u'ihr\xedsk', u'incident', u'intranspon\xedveis', u'in\xedcio', u'in\xfd', u'ispit', u'istragu', u'izbijanju', u'ja\u010danju', u'je', u'jedan', u'jo\u0161', u'kapaciteta', u'kde', u'kombin\xe1cie', u'komplex', u'kon\u010diarmi', u'kosova', u'la', u'lado', u'lequio', u'lete', u'llevar', u'lo', u'longo', u'ly\u017eova\u0165', u'mais', u'man\u017eelky', u'mas', u'me', u'mesmo', u'meu', u'minha', u'misije', u'mo\u017enos\u0165ami', u'muy', u'm\xe1s', u'm\xe3e', u'na', u'nada', u'nad\u0161en\xfdmi', u'nasilja', u'negativas', u'nie', u'nieko\u013ek\xfdch', u'no', u'obaviti', u'obe\u0107ao', u'para', u'parecem', u'parecer', u'pod', u'pone', u'pon\xfakaj\xfa', u'por', u'potrebuj\xfa', u'po\u0161to', u'prava', u'predstavlja', u'pri', u'prova\xe7\xf5es', u'pro\u0161losedmi\u010dnom', u'punham', u'qual', u'qualquer', u'que', u'quem', u'rak\xfaske', u'relaci\xf3n', u'rezortov', u'sa', u'sebe', u'sempre', u'situa\xe7\xf5es', u'sjeveru', u'spojen\xfdch', u'suplantar', u's\xfa', u'taj', u'tak', u'talianske', u'teve', u'tive', u'todas', u'tr\xe1venia', u'una', u've\u013ek\xfd', u'vida', u'visto', u'vladavine', u'vo', u'vo\u013en\xe9ho', u'vysok\xfdmi', u'vy\u017eitia', u'v\xe4\u010d\u0161ine', u'v\u017edy', u'ya', u'zauj\xedmav\xe9', u'zime', u'\u0107e', u'\u010dasu', u'\u010di', u'\u010fal\u0161\xedmi', u'\u0161vaj\u010diarske']