X-Git-Url: http://iramuteq.org/git?p=iramuteq;a=blobdiff_plain;f=parse_factiva_txt.py;h=fd856f4c82812999dfa018e7ee87ad9f63d513ac;hp=53f6d6dad575ee4fd5173e23c94c487ff282c79f;hb=42499e5db4394973bd0761d40ea09e515925ed4b;hpb=8fa853a25a9d62b1446e1bc543e5a3a4d0e03dcf diff --git a/parse_factiva_txt.py b/parse_factiva_txt.py index 53f6d6d..fd856f4 100644 --- a/parse_factiva_txt.py +++ b/parse_factiva_txt.py @@ -1,66 +1,114 @@ #!/bin/env python # -*- coding: utf-8 -*- #Author: Pierre Ratinaud -#Copyright (c) 2012 Pierre Ratinaud -#Lisense: GNU/GPL +#Copyright (c) 2012-2013 Pierre Ratinaud +#License: GNU/GPL import os import codecs +import re -txtdir = 'dev/factiva_txt' #repertoire des textes -#txtdir = 'corpus/jeunesdebanlieues' -fileout = 'dev/factiva_txt_out.txt' -encodage_in = 'utf8' -encodage_out = 'utf8' +#txtdir = 'dev/factiva_txt' +#fileout = 'dev/factiva_txt_out.txt' +#encodage_in = 'utf8' +#encodage_out = 'utf8' +mois = {u'janvier' : '01', + u'février' : '02', + u'mars' : '03', + u'avril' : '04', + u'mai' : '05', + u'juin' : '06', + u'juillet' : '07', + u'août' : '08', + u'septembre' : '09', + u'octobre' : '10', + u'novembre' : '11', + u'décembre' : '12', + u'january' : '01', + u'february': '02', + u'march' : '03', + u'april': '04', + u'may': '05', + u'june' : '06', + u'july': '07', + u'august': '08', + u'september' : '09', + u'october': '10', + u'november': '11', + u'december': '12'} -def parsetxt(txt): + +def parsetxtpaste(txt): """ parser de texte pour factiva + à partir d'un copier/coller de la fenêtre de visualisation + merci à Lucie Loubère pour l'astuce :) """ no = ['NS','RE','IPD','CO','IN'] # les balises qui signalent une fin - txt = txt.splitlines() #met le texte dans une liste de lignes - txt.pop(0) # la premiere ligne sert a rien - txt = txt[0:(len(txt)-10)] # les dernieres lignes ne servent a rien + txt = txt.splitlines() keepline = False ucis = [] - for line in txt : #pour chaque ligne du texte... - if line.startswith('---------------------------------------------------------------') : # si la ligne commence avec... - ucis.append([['****'],'']) # c'est une nouvelle uci - keepline = False - elif line.startswith('SN ') : #source - source = '*source_' + line[4:].replace(' ','').replace('\'','').replace(u'´','').replace(u'’','').replace('-','').lower() + for line in txt : + if line.startswith(u'Article') : + lp = line.split() + if len(lp) > 2 : + if lp[2] == u'Article' or lp[2] == u'Next' or lp[2] == u'Previous': + ucis.append([[u'****'],'']) + keepline = False + if line.startswith('SN ') : #source + jsource = re.sub(u'[\'" !\.?;,:\+\-°&]', '', line[4:]) + source = u'_'.join([u'*source', jsource]).lower() + #source = '*source_' + line[4:].replace(' ','').replace('\'','').replace(u'´','').replace(u'’','').replace('-','').lower() ucis[-1][0].append(source) elif line.startswith('PD ') : #date - mois_annee = '*date_' + line[4:].split(' ')[1] + line[4:].split(' ')[2] - ucis[-1][0].append(mois_annee) - elif line in no : #fin + datemois = line[4:].split(' ')[1].lower() + datemois = mois.get(datemois, datemois) + dateannee = line[4:].split(' ')[2] + datejour = '%02d' % int(line[4:].split(' ')[0]) + am = '_'.join([u'*am', dateannee, datemois]) + amj = '_'.join([u'*amj', dateannee, datemois, datejour]) + ucis[-1][0].append(am) + ucis[-1][0].append(amj) + annee = '_'.join([u'*annee', dateannee]) + ucis[-1][0].append(annee) + elif line.strip() in no : #fin keepline = False - elif line.startswith('RF ') : #fin + elif line.startswith('RF ') : #fin keepline = False - elif line in ['LP', 'TD'] : #debut texte + elif line.strip() in ['LP', 'TD'] : #debut texte keepline = True else : pass - if keepline and line not in ['LP', 'TD'] : - ucis[-1][1] = '\n'.join([ucis[-1][1],line]) + if keepline and line.strip() not in ['LP', 'TD', ''] : + ucis[-1][1] = '\n'.join([ucis[-1][1],line.replace(u'*', ' ')]) return ucis def print_ucis(ucis, ofile, encodage) : - toprint = '\n'.join(['\n'.join([' '.join(uci[0]),uci[1]]) for uci in ucis]) - ofile.write(toprint.encode(encodage)) + #elimination des articles vides + ucis = [uci for uci in ucis if uci[1].strip() != ''] + toprint = '\n\n'.join(['\n'.join([' '.join(uci[0]),uci[1]]) for uci in ucis]) + ofile.write(toprint.encode(encodage, errors='replace') + '\n') -def doparse(txtdir, fileout, encodage_in, encodage_out): - files = os.listdir(txtdir) #liste des fichiers dans txtdir - with open(fileout,'w') as outf : #ouverture du fichier en sortie - for f in files : #pour chaque fichier en entree... - f= os.path.join(txtdir, f) #chemin du fichier - with codecs.open(f, 'r', encodage_in) as infile : #ouverture du fichier - content = infile.read() #lecture du fichier - ucis = parsetxt(content) - print_ucis(ucis, outf, encodage_out) +class ParseFactivaPaste : + def __init__(self, txtdir, fileout, encodage_in, encodage_out) : + files = [] + for root, subfolders, subfiles in os.walk(txtdir) : + nf = [os.path.join(root, f) for f in subfiles if f.split('.')[-1] == 'txt'] + nf.sort() + files += nf + tot = 0 + with open(fileout,'w') as outf : + for f in files : + print f + with codecs.open(f, 'rU', encodage_in) as infile : + content = infile.read() + ucis = parsetxtpaste(content) + print_ucis(ucis, outf, encodage_out) + tot += len(ucis) + print 'ok', len(ucis), 'articles', ' - total : ', tot #for dat in ['2001','2002','2003','2004', '2005','2006','2007','2008','2009','2010','2011'] : # path = os.path.join(txtdir,dat)