2014-04-07 19 views
27

scikit-öğrenirler.Jetonu öğrenmek için CountVectorizer'ı jetonları ayıklamak için kullanılmayan dokümanların sıklığını saymak için kullanabilir miyim? Ben de <code>CountVectorizer</code> sınıfla çalışıyoruz

aşağıda gösterilen şekilde kullanıldığında, son çıkış özellikler veya jeton sayısını içeren bir dizi oluşacak anlıyoruz.

Bu jeton

yani bir sonraki adım
tags = [ 
    "python, tools", 
    "linux, tools, ubuntu", 
    "distributed systems, linux, networking, tools", 
] 

olduğunu

, anahtar kelime kümesi elde edilir:

aldığımız
from sklearn.feature_extraction.text import CountVectorizer 
vec = CountVectorizer(tokenizer=tokenize) 
data = vec.fit_transform(tags).toarray() 
print data 

[[0 0 0 1 1 0] 
[0 1 0 0 1 1] 
[1 1 1 0 1 0]] 

Bu iyi, ama benim Durum biraz farklı.

Özelliklerin yukarıdakiyle aynı şekilde ayıklamak istiyorum, ancak satırların data içerisindeki özelliklerin ayıklandığı belgelerle aynı olmasını istemiyorum. Ben belgeler, diyelim ki başka bir set sayısını da alabilirsiniz nasıl başka deyişle

,

list_of_new_documents = [ 
    ["python, chicken"], 
    ["linux, cow, ubuntu"], 
    ["machine learning, bird, fish, pig"] 
] 

Ve olsun:

[[0 0 0 1 0 0] 
[0 1 0 0 0 1] 
[0 0 0 0 0 0]] 

Ben CountVectorizer sınıf için belgeleri okuyun ve var geldi Özellik indislerine yönelik terimlerin bir eşlemesi olan vocabulary argümanı boyunca. Ancak bu argümanı bana yardım etmek için alamıyorum.

Herhangi bir tavsiye

takdir edilmektedir.
Not: Yukarıda kullanılan örneğin Matthias Friedrich's Blog nedeniyle tüm kredi.

cevap

39

Sen vocabulary istediğini sağ şeyiz. Bu şu şekilde çalışır:

>>> cv = sklearn.feature_extraction.text.CountVectorizer(vocabulary=['hot', 'cold', 'old']) 
>>> cv.fit_transform(['pease porridge hot', 'pease porridge cold', 'pease porridge in the pot', 'nine days old']).toarray() 
array([[1, 0, 0], 
     [0, 1, 0], 
     [0, 0, 0], 
     [0, 0, 1]], dtype=int64) 
Bu nedenle anahtar olarak istediğiniz özelliklere sahip bir dict iletin.

belgeler bir set üzerinde CountVectorizer kullandıysanız ve sonra da orijinal CountVectorizer ait vocabulary_ özellik kullanmak ve yenisine geçmek, yeni bir dizi için olanlar belgelerden özelliklerin setini kullanmak istiyorum. Yani örnekte,

newVec = CountVectorizer(vocabulary=vec.vocabulary_) 

ilk birinden kelime kullanarak yeni dizgeciklerini oluşturmak için yapabilirdi.

+0

Teşekkür buna new_docs.toarray() çıktısını karşılaştırmak, bu harika görünüyor! İlk çözüm için: kelime bilgisi her zaman bir dict değil, bir liste olmalı mı? Yanılıyorsam beni düzeltin, ama sayımlar (0, 1, 2) ilgisiz gibi görünüyor. Ana hatlarıyla belirttiğiniz ikinci yöntem, belki biraz daha net görünüyor. –

+1

@ MattO'Brien: Haklısın, bir liste olabilir, belgeleri yanlış okuyorum. Cevabımı düzenledim. İkinci yönteme rağmen, bu bir demekti, çünkü bu, donatılmış bir vectorizer'ın 'vocabulary_' yöntemidir. – BrenBarn

+1

BrenBarn, cevabınız bana çok zaman kazandırdı. Ciddi anlamda. Bu sitede olduğun için teşekkürler. –

6

fit_transform veya yalnızca fit numaralı telefonu arayarak orijinal sözcük kaynağınızda vektörleştiricinin bir sözcük haznesi öğrenmesi gerekir.

Sonra transform() yöntemi ile herhangi bir yeni veri kaynağı bu fit vectorizer kullanabilirsiniz.

Sen uygun tarafından üretilen kelime vectorizer.vocabulary_ yoluyla (ID belirteci için kelimenin yani eşleşme) elde edebilirsiniz (eğer CountVectorizer adını vectorizer isim varsayarak.

0
>>> tags = [ 
    "python, tools", 
    "linux, tools, ubuntu", 
    "distributed systems, linux, networking, tools", 
] 

>>> list_of_new_documents = [ 
    ["python, chicken"], 
    ["linux, cow, ubuntu"], 
    ["machine learning, bird, fish, pig"] 

] 

>>> from sklearn.feature_extraction.text import CountVectorizer 
>>> vect = CountVectorizer() 
>>> tags = vect.fit_transform(tags) 

# vocabulary learned by CountVectorizer (vect) 
>>> print(vect.vocabulary_) 
{'python': 3, 'tools': 5, 'linux': 1, 'ubuntu': 6, 'distributed': 0, 'systems': 4, 'networking': 2} 

# counts for tags 
>>> tags.toarray() 
array([[0, 0, 0, 1, 0, 1, 0], 
     [0, 1, 0, 0, 0, 1, 1], 
     [1, 1, 1, 0, 1, 1, 0]], dtype=int64) 

# to use `transform`, `list_of_new_documents` should be a list of strings 
# `itertools.chain` flattens shallow lists more efficiently than list comprehensions 

>>> from itertools import chain 
>>> new_docs = list(chain.from_iterable(list_of_new_documents) 
>>> new_docs = vect.transform(new_docs) 

# finally, counts for new_docs! 
>>> new_docs.toarray() 
array([[0, 0, 0, 1, 0, 0, 0], 
     [0, 1, 0, 0, 0, 0, 1], 
     [0, 0, 0, 0, 0, 0, 0]]) 

CountVectorizer kelime kullanıyor new_docs üzerinde tags öğrenilen doğrulamak için: yine vect.vocabulary_ yazdırmak veya tags.toarray()

İlgili konular