6

Pythonsklearnライブラリを使用しています。私は150,000以上の文を持っています。

配列のようなオブジェクトが必要です。各行は文用で、各列は単語に対応し、各要素はその文の単語数です。

例:2つの文が「犬が走った」と「少年が走った」だった場合、私は必要です

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

(列の順序は関係なく、どの列がどの単語に割り当てられているかによって異なります)

私の配列はスパースになります(各文には可能な単語の一部が含まれます)ので、scipy.sparseを使用しています。

def word_counts(texts, word_map):
    w_counts = sp.???_matrix((len(texts),len(word_map)))

    for n in range(0,len(texts)-1):
        for word in re.findall(r"[\w']+", texts[n]):
            index = word_map.get(word)
            if index != None:
                w_counts[n,index] += 1
    return w_counts

...
nb = MultinomialNB() #from sklearn
words = features.word_list(texts)
nb.fit(features.word_counts(texts,words), classes)

どのスパース行列が最適か知りたいです。

coo_matrixを使用しようとしましたが、エラーが発生しました:

TypeError:'coo_matrix'オブジェクトに属性'__getitem__'がありません

COOのドキュメントを見ましたが、次の点で非常に混乱していました

スパース行列は算術演算で使用できます
...COO形式の欠点...直接サポートされていません:算術演算

私はdok_matrixを使用しましたが、それは機能しましたが、この場合にこれが最適に機能するかどうかはわかりません。

前もって感謝します。

4

1 に答える 1

6

lil_matrixまたはdok_matrix;を試してください。それらは構築と検査が簡単です(ただし、の場合、lil_matrix各挿入には線形時間がかかるため、非常に遅くなる可能性があります)。スパース行列を受け入れるScikit-learn推定量は、任意の形式を受け入れ、それらを内部で効率的な形式に変換します(通常csr_matrix)。行列のメソッドtocootodokなどtocsrを使用して、自分で変換を行うこともできます。scipy.sparse

または、scikit-learnがまさにこの目的のために提供するCountVectorizerまたはクラスを使用するだけです。ドキュメント全体を入力として受け取ります。DictVectorizerCountVectorizer

>>> from sklearn.feature_extraction.text import CountVectorizer
>>> documents = ["The dog ran", "The boy ran"]
>>> vectorizer = CountVectorizer(min_df=0)
>>> vectorizer = CountVectorizer(min_df=0, stop_words=[])
>>> X = CountVectorizer.fit_transform(documents)
>>> X = vectorizer.fit_transform(documents)
>>> X.toarray()
array([[0, 1, 1, 1],
       [1, 0, 1, 1]])

...DictVectorizerただし、トークン化とカウントがすでに行われていることを前提としています。その結果、dictサンプルごとに次のようになります。

>>> from sklearn.feature_extraction import DictVectorizer
>>> documents = [{"the":1, "boy":1, "ran":1}, {"the":1, "dog":1, "ran":1}]
>>> X = vectorizer.fit_transform(documents)
>>> X.toarray()
array([[ 1.,  0.,  1.,  1.],
       [ 0.,  1.,  1.,  1.]])
>>> vectorizer.inverse_transform(X[0])
[{'ran': 1.0, 'boy': 1.0, 'the': 1.0}]

min_dfへの引数CountVectorizerは数リリース前に追加されました。古いバージョンを使用している場合は、それを省略するか、アップグレードしてください。)

編集FAQによると、私は自分の所属を開示しなければならないので、ここに行きます:私はの作者でDictVectorizerあり、の一部も書いていCountVectorizerます。

于 2012-11-08T17:22:07.920 に答える