4

私はスパース行列を扱い始めているので、このトピックについてはあまり熟練していません。私の問題は、単語リストからの単純な共起行列があり、同じコンテキストで単語が出現する回数を数える単語ごとの2次元共起行列だけです。コーパスはそれほど大きくないため、マトリックスは非常にスパースです。それをスパース行列に変換して、より適切に処理できるようにし、最終的には後で行列の乗算を実行したいと思います。これまで私が行ったことは次のとおりです(最初の部分のみ、残りは出力形式とクリーニングデータのみです):

def matrix(from_corpus):    
d = defaultdict(lambda : defaultdict(int))
        heads = set() 
        trans = set()
        for text in corpus:
            d[text[0]][text[1]] += 1
            heads.add(text[0])
            trans.add(text[1])

        return d,heads,trans

私のアイデアは、新しい関数を作成することです。

def matrix_to_sparse(d):
    A = sparse.lil_matrix(d)

これは意味がありますか?ただし、これは機能しておらず、どういうわけか、スパース行列を取得する方法がありません。numpy配列で作業する方がよいでしょうか?これを行うための最良の方法は何でしょうか。行列を扱う多くの方法を比較したいと思います。

誰かが私をその方向に向かわせることができればいいのにと思います。

4

1 に答える 1

7

SciPyのCOO形式の一連のドキュメントからドキュメント用語マトリックスを作成する方法は次Aのとおりです。これは使いやすさと効率(*)の間の適切なトレードオフです。

vocabulary = {}  # map terms to column indices
data = []        # values (maybe weights)
row = []         # row (document) indices
col = []         # column (term) indices

for i, doc in enumerate(documents):
    for term in doc:
        # get column index, adding the term to the vocabulary if needed
        j = vocabulary.setdefault(term, len(vocabulary))
        data.append(1)  # uniform weights
        row.append(i)
        col.append(j)

A = scipy.sparse.coo_matrix((data, (row, col)))

ここで、共起行列を取得するには、次のようにします。

A.T * A

(対角線は無視してください。対角線は、それ自体との項の共起、つまり頻度の2乗を保持します)。

または、 Gensimscikit-learnなど、この種のことを行うパッケージを使用します。(私は両方のプロジェクトに貢献しているので、これは公平なアドバイスではないかもしれません。)

于 2013-02-22T18:00:39.700 に答える