14. december 2010 - 15:00Der er
14 kommentarer og 1 løsning
Python, gem linie nr ved indeksering
Jeg er igang med at lave en søgemaskine som bla. skal kunne indeksere nogle tekster. Programmet er næsten færdig, jeg vil dog gerne tilføje linienumre til søgeoutputtet, dvs. når der søges på et ord skal output ikke blot være de relevante tekster og antal af reultater, men også hvilke linienumre disse fremkommer på. Jeg indekserer teksterne med denne funktion:
def nuke(text): f = open(text).read() words = list(re_split.split(f)) t = [w.lower() for w in words if w != ',' and w != ':' and w != '(' and w != ')' and w != '-' and w.isdigit() == False] b = [w for w in t if w not in stopord] return b
Jeg tænker at løsningen ligger i at lave om på re_split og muligvis tilføje en løkke, som tildeler indekstermerne en værdi, ved hvert linieskift og smider resultatet ind i en dictionary.
Er dette den optimale løsning, hvis overhovedet mulig?
Den logik kan jeg sagtens følge, men udover tælleren kan jeg ikke greje en metode til at gemme tæller og ord. Jeg misforstår måske din mening. Kan du uddybe?
#t1 er teksten lst = [] bla = [] lines = 0 l = 'line' w = 'words' for line in t1.splitlines(): lines += 1 lst.append({l:lines, w:line}) for itm in lst: if 'agurk' in itm['words']: bla.append(itm['line']) print itm['line'] print bla
... men koden kan ikke findet ordet, hvis det f.eks. starter med stort bogstav, hmm, hvad mangler jeg?
Hvad mener du? Vi kan hurtigt blive enige om at det er en forvirrende opskrift jeg hat bikset sammen, men den virker. Hvis jeg f.eks. printer lst, så returnerer den næsten det som du foreslog, dvs. en dictionaey med linjenummer sammen med ordene i den linje. Det ser således ud for en tekst på 3 linjer: [{'line': 1, 'words': 'Agurk'}, {'line': 2, 'words': 'Cucumis Sativus/Anguria'}, {'line': 3, 'words': 'Gherkin, small cucumber'}]
Nu har jeg forsøgt med den regex-funktion som du hjalp mig med i en tidl. tråd, nemlig re_split = re.compile('[ .,;:!?*)(/\n\r\t-]+') for-løkke nr. 2 smider hvert ord enkeltvis ind under linjenr. men når jeg indsætter h i anden løkke får jeg en fejl. Hvordan kan det være?
for line in t1.splitlines(): lines += 1 g = re_split.split(line) h = [x.lower for x in g] for wd in g: lst.append({l:lines, w:wd})
Output ser nu sådan ud: [{'line': 1, 'words': 'agurk'}, {'line': 2, 'words': 'cucumis'}, {'line': 2, 'words': 'sativus'}, {'line': 2, 'words': 'anguria'}, {'line': 3, 'words': 'gherkin'}].. osv Nu er den i stand til at finde 'agurk' i første linje, men ikke hvis det f.eks. staves 'agurken' eller lign. variation. Burde den ikke kunne finde ud af det når jeg spørger: if 'agurk' in itm['words']: ?
print 'agurk' in 'agurk' print 'agurk' in 'agurken' print 'agurk' in 'Agurk' print 'agurk' in 'Agurken' print 'agurk' in 'Agurk'.lower() print 'agurk' in 'Agurken'.lower()
AHHhhh, det er mig der ikke tænker. 'Agurk' forekommer 14 gange i teksten og 13 af dem står i samme linje, det tænkte jeg ikke lige over da jeg bedømte mit output. Jeg har nu testet et andet ord og kan konkludere at det virker perfekt. Endnu engang tak for din hjælp :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.