Frage

Dies ist ein Problem, das ich habe für eine lange Zeit mein Gehirn wurde Abstich, so würde jede mögliche Hilfe groß sein. Ich habe eine Datei, die mehrere Zeilen in dem folgende Format (Wort, Zeit, dass das Wort in aufgetreten, und die Häufigkeit der Dokumente das gegebene Wort innerhalb der gegebenen Instanz in der Zeit enthalten) enthält. Unten ist ein Beispiel dafür, was die Eingabedatei aussieht.

#inputfile
<word, time, frequency>
apple, 1, 3
banana, 1, 2
apple, 2, 1
banana, 2, 4
orange, 3, 1

Ich habe Python-Klasse unter, dass ich verwenden 2-D-Wörterbücher erstellen die obige Datei als Schlüssel zu speichern und Frequenz als Wert:

class Ddict(dict):
    '''
    2D dictionary class
    '''
    def __init__(self, default=None):
            self.default = default

    def __getitem__(self, key):
            if not self.has_key(key):
                self[key] = self.default()
            return dict.__getitem__(self, key)


wordtime=Ddict(dict) # Store each inputfile entry with a <word,time> key
timeword=Ddict(dict) # Store each inputfile entry with a <time,word> key

# Loop over every line of the inputfile
for line in open('inputfile'):
    word,time,count=line.split(',')

    # If <word,time> already a key, increment count
    try:
        wordtime[word][time]+=count
    # Otherwise, create the key
    except KeyError:
        wordtime[word][time]=count

    # If <time,word> already a key, increment count     
    try:
        timeword[time][word]+=count
    # Otherwise, create the key
    except KeyError:
        timeword[time][word]=count

Die Frage, die ich habe bezieht sich auf bestimmte Dinge, die Berechnung, während über die Einträge in diesem 2D-Wörterbuch iterieren. Für jedes Wort 'w' zu jeder Zeit 't', berechnen:

  1. Die Anzahl der Dokumente mit Wort 'w' innerhalb Zeit 't'. (A)
  2. Die Anzahl der Dokumente ohne Wort 'w' innerhalb Zeit 't'. (B)
  3. Die Anzahl der Dokumente mit Wort 'w' außerhalb Zeit 't'. (C)
  4. Die Anzahl der Dokumente ohne Wort 'w' außerhalb Zeit 't'. (D)

Jedes der Elemente repräsentiert über einen der Zellen einer Chi-Quadrat-Kontingenztabelle für jedes Wort und Zeit. Können alle diese innerhalb einer einzigen Schleife berechnet werden oder haben sie getan einer nach dem anderen?

sein müssen

Im Idealfall würde ich die Ausgabe mag zu sein, was unten, wobei a, b, c, d sind alle Gegenstände berechnet über:

print "%s, %s, %s, %s" %(a,b,c,d)

Bei der Eingabedatei über das Ergebnisses des Versuchs, die Kontingenztabelle für das Wort ‚Apfel‘ zum Zeitpunkt ‚1‘ würde (3,2,1,6) zu finden sein. Ich werde erklären, wie jede Zelle berechnet wird:

  • ‚3‘ Dokumente enthalten ‚Apfel‘ innerhalb Zeit '1'.
  • Es gibt ‚2‘ Dokumente innerhalb der Zeit '1', die nicht enthalten 'Apfel'.
  • Es ist ‚1‘ Dokument enthält 'Apfel' außerhalb der Zeit '1'.
  • Es gibt 6 Dokumente außerhalb der Zeit ‚1‘ enthalten, die nicht das Wort 'Apfel' (1 + 4 + 1).
War es hilfreich?

Lösung

Ihre 4 Zahlen für Apfel / 1 Add bis zu 12, mehr als die Gesamtzahl der Beobachtungen (11)! Es gibt nur 5 Dokumente außerhalb der Zeit ‚1‘, die das Wort ‚Apfel‘ nicht enthalten.

Sie müssen die Beobachtungen in vier getrennten Sub-Sätze partitionieren:
a: Apfel und 1 => 3
b: nicht-Apfel und 1 => 2
c: Apfel und nicht-1 => 1 | d: nicht-Apfel und nicht-1 => 5

Hier einige Code, zeigt einen Weg, es zu tun:

from collections import defaultdict

class Crosstab(object):

    def __init__(self):
        self.count = defaultdict(lambda: defaultdict(int))
        self.row_tot = defaultdict(int)
        self.col_tot = defaultdict(int)
        self.grand_tot = 0

    def add(self, r, c, n):
        self.count[r][c] += n
        self.row_tot[r] += n
        self.col_tot[c] += n
        self.grand_tot += n

def load_data(line_iterator, conv_funcs):
    ct = Crosstab()
    for line in line_iterator:
        r, c, n = [func(s) for func, s in zip(conv_funcs, line.split(','))]
        ct.add(r, c, n)
    return ct

def display_all_2x2_tables(crosstab):
    for rx in crosstab.row_tot:
        for cx in crosstab.col_tot:
            a = crosstab.count[rx][cx]
            b = crosstab.col_tot[cx] - a
            c = crosstab.row_tot[rx] - a
            d = crosstab.grand_tot - a - b - c
            assert all(x >= 0 for x in (a, b, c, d))
            print ",".join(str(x) for x in (rx, cx, a, b, c, d))

if __name__ == "__main__":

    # inputfile
    # <word, time, frequency>
    lines = """\
    apple, 1, 3
    banana, 1, 2
    apple, 2, 1
    banana, 2, 4
    orange, 3, 1""".splitlines()

    ct = load_data(lines, (str.strip, int, int))
    display_all_2x2_tables(ct)

und hier ist die Ausgabe:

orange,1,0,5,1,5
orange,2,0,5,1,5
orange,3,1,0,0,10
apple,1,3,2,1,5
apple,2,1,4,3,3
apple,3,0,1,4,6
banana,1,2,3,4,2
banana,2,4,1,2,4
banana,3,0,1,6,4
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top