1

テキストを分類するためのロジスティック回帰手法を実践しようとしています.apxn 行列の形式でデータセットを構築したいと考えています.演劇は p 行、一意の単語は n 列です. 作業するテキストが既にあります。その中の単語を数えるだけです。

どの単語がどの芝居に登場するかを追跡することは重要です。そのため、特定の芝居について、固有の単語を集計する Python 辞書を作成することができました。私がどうすればよいかわからないのは、これらの口述を組み合わせることです。

romeo = {[alas,2],[julliet,35]}
caesar = {[et,1],[tu,3],[cassius,12]}

マージしてマトリックスを生成できます

      alas  julliet  et  tu cassius
romeo  2        35    0   0  0 
caesar 0        0     1   3  12

わかりやすくするために、各劇が固有の言葉だけで構成されている例を作成しましたが、実際にはこれはまったく当てはまりません。

これらの辞書からこのマトリックスを作成するにはどうすればよいでしょうか? 別の場所から始めた方が簡単ですか?

4

3 に答える 3

1

これは動作し、テスト済みです:

from itertools import chain
from collections import defaultdict

romeo = {'alas':2, 'juliet':35, 'hello':1}
caesar = {'et':1, 'tu':3, 'cassius':12, 'hello':1}

dicts = defaultdict(dict)
dicts['romeo'] = romeo
dicts['caesar'] = caesar

columns = list(set(list(chain(romeo.keys(), caesar.keys()))))

matrix = defaultdict(dict)

for coll in ('romeo', 'caesar'):
    matrix[coll] = {}
    for key in columns:
        if dicts[coll].has_key(key):
            matrix[coll][key] = dicts[coll][key]
        else:
            matrix[coll][key] = 0

print columns

for coll in matrix.keys():
    for key in columns:
        print matrix[coll][key], 
    print '\n'

説明: 両方の辞書のすべてのキーを組み合わせてから、ループを実行し、新しい dict の dict を作成します :)

于 2012-03-12T01:39:10.363 に答える
0

ネストされた辞書、または 2 次元辞書を使用します。ネストされた場合、まず、辞書の形式を適切な形式に変更する必要があります。

romeo = {[alas,2],[julliet,35]}
caesar = {[et,1],[tu,3],[cassius,12]}

次のようにする必要があります。

romeo = {'alas':2,'julliet': 35}
caesar = {'et':1,'tu':3,'cassius':12}

そこから、辞書内のすべての「値」をループして辞書をネストできるため、マトリックスの代わりに次のようなものを使用できます。

#declare first:
Ds = {{}}

次に、ループを使用して入力します。

Ds = {
      'romeo' : {'et': 0, 'alas':2,'julliet': 35, tu':0,'cassius':0}, 
      'caesar' :  {'et':1, 'alas':0, 'julliet': 0, 'tu':3,'cassius':12}
      }

お役に立てれば。

于 2012-03-12T01:34:47.303 に答える
0

結局、参照が以前に存在しなかったときに辞書または辞書エントリ (場所に応じて) を作成する方法が好きだったので、defaultdict を実装することになりました。

必要なもので完全な defaultdict を作成し、それからゆっくりと CSV に出力しました。

opensourceshakespeare.com からの全文ダンプを使用しました。ここに私が書いたものがあります。

    playNames = {}

    for line in listOfLines:
            try:
                    playNames[line.rsplit('~')[0]] += 1
                    if line.rsplit('~')[0] == '':
                        print line
            except:
                    playNames[line.rsplit('~')[0]] = 1

    #print playNames.keys()

    #
    # Now let's build a dictionary for each play
    #

    for line in listOfLines:

            try:
                    playNames[line.rsplit('~')[0]] += line.rsplit('~,~')[2]
                    playNames[line.rsplit('~')[0]] += " "
            except:
                    playNames[line.rsplit('~')[0]] = line.rsplit('~,~')[2]
                    playNames[line.rsplit('~')[0]]+= " "

    #
    # for each play, tokenize text into list of words
    #

    for key in playNames.iterkeys():
            playNames[key] = playNames[key].split(' ')

    plays = collections.defaultdict(dict)

    for key in playNames.iterkeys():
            for val in playNames[key]:
                    try:
                            plays[key][val] += 1
                    except:
                            plays[key][val] = 1

    #
    # build a set of words
    #

    words = set()

    for eachplay in plays.itervalues():
            words.update(eachplay.keys())

    outfile = open("wordlist.csv",'w')

    i=0
    outfile.write(",")
    for word in words:

            outfile.write(word)
            outfile.write(",")
            i+=1
    print "words ",i

    outfile.write("\n")
    for eachplay in plays.iterkeys():
            i = 0
            outfile.write(eachplay)

            outfile.write(",")
            for word in words:
                    try:
                            outfile.write(str(plays[eachplay].get(word,"0")))
                            #print word,plays[eachplay][word]
                    except:
                         outfile.write("")
                    i+=1
                    outfile.write(",")
            outfile.write("\n")
            print eachplay," ",i
    outfile.close()
于 2012-03-15T17:48:34.413 に答える