def 뉴스파싱모듈의_두테이블간_컬럼들의_개수비교보고(dbg_on=False, shown_cnt=1): """ condition_li : 조건튜플 목록 (테이블명, 검사타겟컬럼1, 검사타겟컬럼2, ...) 두 테이블 : RD_TBL, TBL 결론 두 테이블은 1:1 관계다. 뉴스원본TBL에서 가져온 모든 컬럼정보는 뉴스TBL과 동일해야 한다. """ condition_li = [ (RD_TBL명, '뉴스_url', '수집일시', '_id'), (TBL명, '뉴스_url', '수집일시', '뉴스_원본id'), ] rpt_dicli = [] for cond in condition_li: print('\n' + '-'*60 + ' TBL명:{}, URL컬럼명:{}'.format(cond[0], cond[1])) projection = {'_id':1} df = mg.find(db명=DB명, tbl명=cond[0], query=None, projection=projection, dbg_on=dbg_on, 컬럼순서li=[], df보고형태='df') url_li = mg.distinct(db명=DB명, tbl명=cond[0], col명=cond[1], query=None, dbg_on=dbg_on, shown_cnt=shown_cnt) 수집일시_li = mg.distinct(db명=DB명, tbl명=cond[0], col명=cond[2], query=None, dbg_on=dbg_on, shown_cnt=shown_cnt) 뉴스원본id_li = mg.distinct(db명=DB명, tbl명=cond[0], col명=cond[3], query=None, dbg_on=dbg_on, shown_cnt=shown_cnt) 자료구조_dic = { 'TBL명':cond[0], 'URL컬럼명':cond[1], '총_doc수':len(df), '유일한_URL수':len(url_li), '유일한_수집일시수':len(수집일시_li), '뉴스_원본id':len(뉴스원본id_li), } rpt_dicli.append(자료구조_dic) df = pd.DataFrame(rpt_dicli) print(df) return df
def 뉴스수집모듈의_두테이블간_컬럼들의_개수비교보고(dbg_on=False, shown_cnt=1): """ condition_li : 조건튜플 목록 (테이블명, 검사타겟컬럼1, 검사타겟컬럼2, ...) 결론 유일한 URL 개수만 서로 동기화되었다면 좋다. doc총개수, 유일한 수집일수는 화면배치TBL이 더 많은게 당연하다. 수집일수는 마이크로초까지 다루기 때문이다. """ condition_li = [ (lay.TBL명, 'href', '수집일시'), (RD_TBL명, '뉴스_url', '수집일시'), ] rpt_dicli = [] for cond in condition_li: print('\n' + '-'*60 + ' TBL명:{}, URL컬럼명:{}'.format(cond[0], cond[1])) projection = {'_id':1} df = mg.find(db명=DB명, tbl명=cond[0], query=None, projection=projection, dbg_on=dbg_on, 컬럼순서li=[], df보고형태='df') url_li = mg.distinct(db명=DB명, tbl명=cond[0], col명=cond[1], query=None, dbg_on=dbg_on, shown_cnt=shown_cnt) 수집일시_li = mg.distinct(db명=DB명, tbl명=cond[0], col명=cond[2], query=None, dbg_on=dbg_on, shown_cnt=shown_cnt) 자료구조_dic = { 'TBL명':cond[0], 'URL컬럼명':cond[1], '총_doc수':len(df), '유일한_URL수':len(url_li), '유일한_수집일시수':len(수집일시_li), } rpt_dicli.append(자료구조_dic) df = pd.DataFrame(rpt_dicli) print(df) return df
def 뉴스TBL에_존재하지않고_언어분석_원본TBL에만_존재하는_뉴스id을_가진_문서삭제(dbg_on=False, 사전검증=False, shown_cnt=1): whoami = dbg.whoami(sys.modules[__name__].__file__, inspect.stack()[0][3], dbg_on) inputs = dbg.inputs(inspect.currentframe(), dbg_on) tbl_A = '뉴스' col_a = '_id' tbl_B = '뉴스제목본문_ETRI언어분석_원본' col_b = '뉴스id' 집합_A = mg.distinct(db명=DB명, tbl명=tbl_A, col명=col_a, query=None, dbg_on=dbg_on, shown_cnt=shown_cnt) query = {col_b: {'$nin': 집합_A}} 차집합_B = mg.distinct(db명=DB명, tbl명=tbl_B, col명=col_b, query=query, dbg_on=dbg_on, shown_cnt=shown_cnt) if dbg_on == True: dbg._li(li=차집합_B, caller=inspect.stack()[0][3], shown_cnt=1) query = {col_b: {'$in': 차집합_B}} mg.delete_many(db명=DB명, tbl명=tbl_B, query=query, dbg_on=dbg_on, 사전검증=사전검증)
def 화면배치TBL_href와_뉴스원본TBL_뉴스url간의_매핑관계_관찰(dbg_on=False, shown_cnt=1): """ condition_li : 조건튜플 목록 (테이블명, 검사타겟컬럼1, 검사타겟컬럼2, ...) """ condition_li = [(lay.TBL명, 'href', '수집일시', '뉴스제목'), (RD_TBL명, '뉴스_url', '수집일시', '뉴스_url'), (TBL명, '뉴스_url', '수집일시', '뉴스제목')] rpt_dicli = [] for cond in condition_li: print('\n' + '-' * 60 + ' TBL명:{}, URL컬럼명:{}'.format(cond[0], cond[1])) projection = {'_id': 1} df = mg.find(db명=DB명, tbl명=cond[0], query=None, projection=projection, dbg_on=dbg_on, 컬럼순서li=[], df보고형태='df') url_li = mg.distinct(db명=DB명, tbl명=cond[0], col명=cond[1], query=None, dbg_on=dbg_on, shown_cnt=shown_cnt) 수집일시_li = mg.distinct(db명=DB명, tbl명=cond[0], col명=cond[2], query=None, dbg_on=dbg_on, shown_cnt=shown_cnt) 뉴스제목_li = mg.distinct(db명=DB명, tbl명=cond[0], col명=cond[3], query=None, dbg_on=dbg_on, shown_cnt=shown_cnt) 자료구조_dic = { 'TBL명': cond[0], 'URL컬럼명': cond[1], '총_doc수': len(df), '유일한_URL수': len(url_li), '유일한_수집일시수': len(수집일시_li), '유일한_뉴스제목수': len(뉴스제목_li), } rpt_dicli.append(자료구조_dic) df = pd.DataFrame(rpt_dicli) print(df) return df
def 뉴스URL_중복제거로_tpl로딩(dbg_on=False, shown_cnt=1): 뉴스원본url_li = mg.distinct(db명=DB명, tbl명=PARSING_TBL, col명='뉴스_url', query=None, dbg_on=dbg_on, shown_cnt=shown_cnt) 뉴스url_li = mg.distinct(db명=DB명, tbl명=PARSED_TBL, col명='뉴스_url', query=None, dbg_on=dbg_on, shown_cnt=shown_cnt) 파싱할url_li = lh.리스트1로부터_리스트2를_제거(li1=뉴스원본url_li, li2=뉴스url_li) return (뉴스원본url_li, 뉴스url_li, 파싱할url_li)
def 뉴스TBL에_뉴스URL이_존재하면_뉴스원본TBL의_파싱완료를_True로_일괄업뎃(dbg_on=False, shown_cnt=1, 사전검증=False): whoami = dbg.whoami(sys.modules[__name__].__file__, inspect.stack()[0][3], dbg_on) inputs = dbg.inputs(inspect.currentframe(), dbg_on) """ """ 입력 = {'shown_cnt': shown_cnt, '사전검증': 사전검증} query = {'뉴스_url': {'$exists': 1}} 뉴스url_li = mg.distinct(db명=DB명, tbl명=PARSED_TBL, col명='뉴스_url', query=query, dbg_on=dbg_on, shown_cnt=shown_cnt) query = {'뉴스_url': {'$in': 뉴스url_li}} update = {'$set': {'파싱완료': True}} mg.update_many(db명=DB명, tbl명=PARSING_TBL, query=query, update=update, upsert=False, dbg_on=dbg_on, 사전검증=사전검증)
def 파싱완료True가_아닌_타겟의_query조건별_개수비교_보고(dbg_on=False): whoami = dbg.whoami(sys.modules[__name__].__file__, inspect.stack()[0][3], dbg_on) inputs = dbg.inputs(inspect.currentframe(), dbg_on) """ 결과 id개수 query 0 1276 'res':{'$ne':None} 1 468 'res':None 2 1744 _ """ query = {'파싱완료': {'$ne': True}, 'res': {'$ne': None}} li1 = mg.distinct(db명=DB명, tbl명=PARSING_TBL, col명='_id', query=query, dbg_on=dbg_on, shown_cnt=1) query = {'파싱완료': {'$ne': True}, 'res': None} li2 = mg.distinct(db명=DB명, tbl명=PARSING_TBL, col명='_id', query=query, dbg_on=dbg_on, shown_cnt=1) query = {'파싱완료': {'$ne': True}} li3 = mg.distinct(db명=DB명, tbl명=PARSING_TBL, col명='_id', query=query, dbg_on=dbg_on, shown_cnt=1) print('\n' + '*' * 60 + inspect.stack()[0][3]) dic = { 'id개수': [len(li1), len(li2), len(li3)], 'query': ["'res':{'$ne':None}", "'res':None", "_"], 'id_li': [li1, li2, li3] } df = pd.DataFrame(dic) df1 = df.copy() del (df1['id_li']) print(df1) return df
def 뉴스_원본TBL에_있는_뉴스url이_화면배치TBL에도_있다면_수집완료True_업뎃(dbg_on=False, 사전검증=False): print('\n' + '='*60 + inspect.stack()[0][3]) 뉴스url_li = mg.distinct(db명=DB명, tbl명=PARSING_TBL, col명='뉴스_url', query=None, dbg_on=dbg_on, shown_cnt=1) query = {'href':{'$in':뉴스url_li}} update = {'$set':{'수집완료':True}} mg.update_many(db명=DB명, tbl명=COLLECTING_TBL, query=query, update=update, upsert=False, dbg_on=dbg_on, 사전검증=사전검증)
def 뉴스XX_언어분석TBL_id조사(): id_li = mg.distinct(db명=DB명, tbl명=TBL명, col명='_id', query=None, dbg_on=True, shown_cnt=1) id_li1 = lh.리스트의_중복제거(li=id_li)
def 뉴스TBL과_RD_TBL간의_뉴스id를_비교대조(dbg_on=True): whoami = dbg.whoami(sys.modules[__name__].__file__, inspect.stack()[0][3], dbg_on) inputs = dbg.inputs(inspect.currentframe(), dbg_on) 뉴스TBL_ids = mg.distinct(db명=DB명, tbl명='뉴스', col명='_id', query=None, dbg_on=dbg_on, shown_cnt=1) RD_TBL_ids = mg.distinct(db명=DB명, tbl명=RD_TBL명, col명='뉴스id', query=None, dbg_on=dbg_on, shown_cnt=1) 뉴스TBL_차집합_ids = lh.리스트1로부터_리스트2를_제거(li1=뉴스TBL_ids, li2=RD_TBL_ids) RD_TBL_차집합_ids = lh.리스트1로부터_리스트2를_제거(li1=RD_TBL_ids, li2=뉴스TBL_ids) 교집한_ids = lh.리스트1과_리스트2의_교집합을_찾기(li1=뉴스TBL_ids, li2=RD_TBL_ids) dic = { 'len(뉴스TBL_차집합_ids)': len(뉴스TBL_차집합_ids), 'len(RD_TBL_차집합_ids)': len(RD_TBL_차집합_ids), 'len(교집한_ids)': len(교집한_ids), } print('\n' + '*' * 60 + inspect.stack()[0][3]) pp.pprint(dic) dic1 = { 'ids명': ['뉴스TBL_차집합_ids', 'RD_TBL_차집합_ids', '교집한_ids'], 'id_li': [뉴스TBL_차집합_ids, RD_TBL_차집합_ids, 교집한_ids], 'ids_len': [len(뉴스TBL_차집합_ids), len(RD_TBL_차집합_ids), len(교집한_ids)] } df = pd.DataFrame(dic1) 함수명 = inspect.stack()[0][3] dbg._df(df, caller=함수명, 컬럼순서li=[], df보고형태='df') mg.insert_many(db명=DB명, tbl명=함수명, dicli=df.to_dict('records'), dbg_on=dbg_on, 사전검증=False)
def RD_TBL의_뉴스id_중복조사(dbg_on=False): whoami = dbg.whoami(sys.modules[__name__].__file__, inspect.stack()[0][3], dbg_on) inputs = dbg.inputs(inspect.currentframe(), dbg_on) 뉴스id_li = mg.distinct(db명=DB명, tbl명=RD_TBL명, col명='뉴스id', query=None, dbg_on=dbg_on, shown_cnt=1) lh.리스트의_중복제거(li=뉴스id_li)
def TBL의_뉴스id가_RDTBL에도_존재한다면_파싱완료는_True여야한다(타겟col명, analyzerMethod='srl', subMethod='WSD', texttype='NNG', dbg_on=False): 파싱타겟col명 = 타겟col명 + analyzerMethod + '_res' 파싱저장col명 = 타겟col명 + analyzerMethod + '_' + subMethod + texttype + 'li' 파싱완료col명 = 타겟col명 + analyzerMethod + '_res' + '파싱완료' query = {파싱저장col명: {'$ne': None}} 뉴스id_li = mg.distinct(db명=DB명, tbl명=TBL명, col명='뉴스id', query=query, dbg_on=dbg_on, shown_cnt=1) query = {'뉴스id': {'$in': 뉴스id_li}, 파싱타겟col명: {'$ne': None}} 뉴스id_RD_li = mg.distinct(db명=DB명, tbl명=RD_TBL명, col명='_id', query=None, dbg_on=dbg_on, shown_cnt=1) #projection = {'_id':1} #df = mg.find(db명=DB명, tbl명=RD_TBL명, query=None, projection=projection, dbg_on=dbg_on, 컬럼순서li=[], df보고형태='df') print(len(뉴스id_RD_li)) query = {'_id': {'$in': 뉴스id_RD_li}} update = {'$set': {파싱완료col명: True}} mg.update_many(db명=DB명, tbl명=RD_TBL명, query=query, update=update, upsert=False, dbg_on=dbg_on, 사전검증=False)
def 뉴스TBL을_뉴스_원본TBL로_복원(dbg_on=False): url_li = mg.distinct(db명=DB명, tbl명=PARSING_TBL, col명='뉴스_url', query=None, dbg_on=False, shown_cnt=10) query = {'뉴스_url':{'$nin':url_li}} projection = {'_id':0, '뉴스_url':1, '수집일시':1} dicli = mg.find(db명=DB명, tbl명=PARSED_TBL, query=query, projection=projection, dbg_on=dbg_on, 컬럼순서li=[], df보고형태='dicli') #""" dicli_len = len(dicli) i=1 for d in dicli: print('\n' + '-'*60 + '{}/{}'.format(i, dicli_len)) query = {'뉴스_url':d['뉴스_url']} update = {'$set':{'수집일시':d['수집일시'], 'r_txt':'파싱완료'}} mg.update_one(db명=DB명, tbl명=PARSING_TBL, query=query, update=update, upsert=True, dbg_on=False) #break i+=1
def 파싱대상_선정(파싱컬럼명, dbg_on=False): print('\n' + '='*60 + inspect.stack()[0][3]) """ """ 입력 = {'파싱컬럼명':파싱컬럼명, 'dbg_on':dbg_on} query = {파싱컬럼명:{'$exists':1}} id_li = mg.distinct(db명=DB명, tbl명=PARSING_TBL, col명='_id', query=query, dbg_on=dbg_on) query = {'_id':{'$nin':id_li}} projection = {'_id':1, 파싱컬럼명:1} df = 뉴스_로딩(query=query, projection=projection, dbg_on=dbg_on) dicli = df.to_dict('records') return dicli
def 화면배치TBL에_존재하지_않는_URL은_뉴스원본TBL에_존재할수_없다(dbg_on=False, 사전검증=False): """ ===== 작업순서 ===== 화면배치TBL에서 유일한 href 목록을 로딩 href_li에 존재하지 않는 뉴스원본TBL의 뉴스_url 목록을 로딩 뉴스_url_li에 해당하는 _id로 문서 삭제 """ href_li = mg.distinct(db명=DB명, tbl명=COLLECTING_TBL, col명='href', query=None, dbg_on=dbg_on, shown_cnt=1) query = {'뉴스_url':{'$nin':href_li}} projection = {'_id':1, '뉴스_url':1} df = mg.find(db명=DB명, tbl명=PARSED_TBL, query=query, projection=projection, dbg_on=dbg_on, 컬럼순서li=[], df보고형태='df') df_len = len(df) pp.pprint({'df_len':df_len}) if df_len == 0: print('\n 정상. 화면배치TBL에_존재하지_않는_URL은_뉴스원본TBL에_존재하지 않는다. \n') else: 삭제할_미존재_뉴스url에_해당하는_id_li = list(df['_id']) query = {'_id':{'$in':삭제할_미존재_뉴스url에_해당하는_id_li}} mg.delete_many(db명=DB명, tbl명=PARSING_TBL, query=query, dbg_on=dbg_on, 사전검증=사전검증)