In [3]:
import numpy as np
import scipy as sp
from scipy import spatial
import pandas as pd
import pickle
import itertools
import operator

set date


In [4]:
date = "2016-06-01"

article df


In [5]:
def load_article(date):
    file = open("./data/article_" + date + ".plk", 'rb')
    article_df = pickle.load(file)
    article_df = article_df[np.invert(article_df.duplicated(subset="newsid"))] # remove duplication
    article_df = article_df[article_df["comment"] > 1000]
    file.close()
    return article_df

In [6]:
%time article_df = load_article(date)
print(len(article_df))
article_df.tail(2)


CPU times: user 47.9 ms, sys: 12.6 ms, total: 60.5 ms
Wall time: 61.9 ms
21
Out[6]:
newsid oid newspaper title link comment likeit content date category
1939 3179775 23 조선일보 "미세먼지에 손놓은 정부, 애꿎은 고등어·삼겹살 탓" http://news.naver.com/main/read.nhn?mode=LSD&m... 2596 1759 ['미세먼지 스트레스'에 빠진 한국] - 무능한 정부에 뿔나"연일 잘못된 예보 남발... 2016-06-01 3
1977 2703707 32 경향신문 스위스, 성인에 매달 300만원 ‘꿈’ 이뤄질까 http://news.naver.com/main/read.nhn?mode=LSD&m... 1069 461 ㆍ‘기본소득 지급안’ 놓고 5일 국민투표 실시“도둑을 교수형에 처하는 대신 모두에게... 2016-06-01 4

comment df


In [7]:
def load_comment(date):
    file = open("./data/comment_" + date + ".plk", 'rb')
    comment_df = pickle.load(file)
    comment_df = comment_df[(comment_df["good"] > 0) & (comment_df["bad"] > 0)].reset_index(drop=True) # remove good:0, bad:0 
    comment_df = comment_df[comment_df["userIdNo"].str.len() < 10] # remove userIdNo > 10
    comment_df["aid"] = comment_df["aid"].apply(lambda aid: int(aid)) # change aid data type to int
    file.close()
    return comment_df

In [8]:
%time comment_df = load_comment(date)
print(len(comment_df))
comment_df.tail(2)


CPU times: user 379 ms, sys: 66.8 ms, total: 445 ms
Wall time: 452 ms
54799
Out[8]:
category aid oid userIdNo userName good bad contents regTime
55866 5 2620983 025 4RWHW tars**** 7.0 2.0 갤럭시앱이랑 플레이스토어만 쓰면 되는데... 2016-06-01 08:19:34
55867 5 2620983 025 13jF4 2858**** 96.0 5.0 이거머냐 거부해도 못하게 악고 다른앱쓸려고하면 중요 어플다운로드중이라고하고 다른어플... 2016-06-01 02:25:22

datas matrix


In [9]:
def make_datas(article_df, comment_df):
    
    # make zeros datas
    unique_user = comment_df["userIdNo"].unique()
    article_list = np.array(article_df["newsid"])
    datas = np.zeros([len(unique_user), len(article_list)])
    
    df = comment_df
    
    for idx, row in df.iterrows():
        
        userIdNo = row["userIdNo"]
        aid = row["aid"]
        
        # continue when no aid in article_list
        if aid not in article_list: 
            continue
            
        # fill values
        row_idx = int(np.where(unique_user==userIdNo)[0])
        aid_idx = int(np.where(article_list==int(aid))[0])
        value = int(datas[row_idx, aid_idx:aid_idx+1])
        datas[row_idx, aid_idx:aid_idx+1] = value + 1
        
    return datas, unique_user, article_list

In [10]:
%time datas, unique_user, article_list = make_datas(article_df, comment_df)


CPU times: user 33.5 s, sys: 286 ms, total: 33.8 s
Wall time: 34.3 s

reduce sample


In [11]:
# remove user samples comment <= 10 (댓글이 10개 이하인 사용자들 제거)
unique_user = unique_user[datas.sum(axis=1) > 10]
datas = datas[datas.sum(axis=1) > 10]
len(datas), len(unique_user)


Out[11]:
(95, 95)

reduce column


In [12]:
article_list = article_list[datas.sum(axis=0) > 0]
datas = datas[:,datas.sum(axis=0) > 0]
len(article_list), datas.shape


Out[12]:
(18, (95, 18))

predict matrix


In [13]:
def predict_vector(datas, target_idx):
    
    dists = [ 
        (idx, spatial.distance.cosine(datas[target_idx,:], data))
        for idx, data in enumerate(datas) 
        if target_idx != idx
    ]
     
    dist_list = sorted(dists, key=lambda tup: tup[1])
    
    dist_index, dist_value = zip(*dist_list)
    
    # remove value 1 sample
    dist_index = np.array(dist_index)[np.array(dist_value) > 0][:5]
    dist_value = np.array(dist_value)[np.array(dist_value) > 0][:5]
    
    return datas[dist_index,:].mean(axis=0)
    
def make_predict(datas):
    
    predict_vectors = []
    
    for idx, data in enumerate(datas):
        
        if idx%100 == 0:
            print(idx, len(datas))
        
        predict_vectors.append( predict_vector(datas, idx) )
        
    return np.array(predict_vectors)

In [14]:
%time predict = make_predict(datas)


0 95
CPU times: user 690 ms, sys: 152 ms, total: 841 ms
Wall time: 732 ms

MAE (mean absolute error)


In [15]:
def mae(data, predict):
    delta = data[data > 0] - predict[data > 0]
    return np.absolute(delta).sum()/len(delta)

def mae_mean(datas, predict):
    mae_list = []
    for idx in range(len(datas)):
        result_mae = mae(datas[idx,:], predict[idx,:])
        mae_list.append(result_mae)
    return np.array(mae_list).mean()

In [16]:
mae_mean(datas, predict)


Out[16]:
3.1252631578947367

transform to pandas dataframe


In [17]:
datas_df = pd.DataFrame(columns=article_list, data=datas)
datas_df.head()


Out[17]:
2086404 145956 2621084 10323763 414993 8444452 8444085 8443941 8442958 2087055 8442575 8442114 2976940 2835768 3179746 2621054 3179775 2703707
0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 1.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

In [18]:
predict_df = pd.DataFrame(columns=article_list, data=predict)
predict_df.head()


Out[18]:
2086404 145956 2621084 10323763 414993 8444452 8444085 8443941 8442958 2087055 8442575 8442114 2976940 2835768 3179746 2621054 3179775 2703707
0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.2 11.2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 11.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.2 0.0 0.2 0.2 0.0 0.0 12.6 0.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.2 0.2 0.0 0.0 0.0 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.8 7.0 0.0 0.2 0.0 0.0 0.0 0.0 0.0

recomend


In [19]:
def recommend(idx, datas, predict):
    recomend_article = article_list[datas[idx, :] == 0]
    recomend_predict = predict[idx, :][datas[idx, :] == 0]
    
    recomend_article = recomend_article[recomend_predict > 0]
    recomend_predict = recomend_predict[recomend_predict > 0]
    
    print(recomend_article)
    print(recomend_predict)
    
    result_list = []
    
    for i in range(len(recomend_article)):
        result_list.append((recomend_article[i], recomend_predict[i]))
        
    return sorted(result_list, key=lambda tup: tup[1])

In [20]:
result_recommend = recommend(2, datas, predict)
recomend_a, point = zip(*result_recommend)


[10323763  8444452  8444085  8442575]
[ 0.2  0.2  0.2  0.4]

In [21]:
for idx in range(len(recomend_a)):
    aritcle = article_df[article_df["newsid"] == recomend_a[idx]]["content"]
    print(aritcle.values, end="\n\n")


[ '<앵커 멘트> 표현의 자유를  용인하는 우리사회의 수준이 어느 정도인지  서울의 한 미술대생이 교내에 실험적 조형물을 설치했습니다. 인터넷상에서  물의를 빚고 있는, 이른바 <일베>를 형상화한  작품인데,  불과 수일 만에 파괴됐습니다.   어떻게 봐야 할까요?  옥유정 기자가 심층취재했습니다. <리포트> 서울 홍익대학교 앞. 한 남성이 커다란 손가락 모양의 조형물을 야구방망이로 부수고.. 밀어서 넘어뜨립니다. 조형물은 굉음을 내며 바닥으로 떨어지면서 부숴졌습니다. 이 조형물은 이 학교 조소과 4학년 학생이 교내 환경조각전에 출품한 작품이었습니다. 작품 설치 이후 일베의 상징물을 예술 소재로 삼은 것이 적절하냐는 논란이 불거졌습니다.<녹취> 김황경(인천시 계양구) : "예술이라고 하는 걸 핑계 삼아서 인식이 별로 안 좋게 보이는 거 다 아는데 만들었으니까 저도 좋진 않았죠."<녹취> 이시진(홍익대 전자전기공학부) : "물론 비판은 해야겠지만 그 표시만 보고서이건 절대악이다 하면서 달려드는 것은 문제가 있는 것 같다." 이 작품을 만든 학생은  사회적 논란이 되고 있는 인터넷 사이트 일베를 예술을 통해  공론화하려는 의도였다고 밝혔습니다.<녹취> 작품 제작자 : "우리 사회에 존재는 하지만 이게 실체는 없어서 저는 이걸 실체로 만들어서 그 일베를 사람들이 어떻게 생각하는지 보여줄 수 있다고 생각했습니다." 작품을 부순 사람은 계획된 행동이었다고 말했습니다.<녹취> 작품 파손자 : "\'표현의 자유다\'라고 말하는 게 제 생각에는 옳지 않은 것 같아서 많은 사람들이 불만을 품고 있다는 것에 대해 어느 정도 경각심을 느끼게 했으면 좋겠다고 생각해서..." 작품 파손에 대해서 홍익대학교 미술대학 교수들은 편가르기식 흑백논리에 의해 작품이 희생된 것은  안타까움을 넘어 걱정스러운 상황이라고 밝혔습니다.<인터뷰> 박창호(숭실대 사회학과 교수) :  "(작품이) 공공성에 위배된다거나공적 질서를 파괴하는 것으로 보지 않는 이상은 결국 물리력 행사를 통해서 파괴한다는 것은 공적 질서를 파괴하는 심각한 중대한 위협이 될 수 있겠죠." 사회적으로 민감한 소재를 가지고 예술 작품을 만들었던  한 미술학도의 도발적인 실험은 불과 며칠 만에 작품 파괴로 막을 내리게 됐습니다. KBS 뉴스 옥유정입니다.옥유정기자 (okay@kbs.co.kr)']

[ '경찰 "\'묻지마 범행\'은 아닌 듯"…피해자는 경찰 주장 반박    (서울=연합뉴스) 임기창 기자 = 서울에서 길 가던 여성을 뒤쫓아가 둔기로 때리고 달아난 20대 남성이 범행 후 투신해 숨졌다.    서울 성동경찰서에 따르면 1일 오전 2시23분 성동구의 한 길가에서 이모(25)씨가 귀가 중이던 A(25·여)씨를 뒤따라가다 눈이 마주치자 갖고 있던 둔기를 꺼내 A씨의 머리를 여러 차례 때렸다.    이씨는 "가만있으면 살려주겠다"며 A씨를 인근 골목으로 끌고 갔다가 인기척이 느껴지자 현장에서 달아났다. A씨는 당시 이씨에게 강하게 저항했고, 머리를 다쳐 병원에서 치료를 받고 있다.    A씨는 경찰에서 이씨를 "모르는 사람"이라고 진술했다.    경찰은 범행 현장 주변 폐쇄회로(CC)TV를 분석, 이씨가 차량을 몰고 A씨가 탄 택시를 따라와 범행하고는 같은 차량으로 도주한 사실을 밝혀냈다.    경찰은 이씨가 운전한 차량 번호를 확인하고 소재를 추적하던 중 그가 오전 3시15분께 관악구의 한 아파트에서 투신해 숨진 사실을 확인했다.    해당 아파트는 이씨가 살던 곳은 아니라고 경찰은 전했다.    경찰은 이번 사건이 \'묻지마 범행\'은 아니라고 보고 있다.    경찰 관계자는 "눈이 마주치자 둔기로 여러 차례 때렸는데 강도가 약해 살인 고의가 없어 보인다"며 "묻지마 범행이었다면 피해자가 저항할 때 더 세게 때리기 마련인데 함몰된 곳도 없는 수준의 부상"이라고 설명했다.    이씨에게 정신병력이 있었는지는 아직 확인되지 않았다고 경찰은 밝혔다.    이에 피해자 A씨는 연합뉴스와 통화에서 "전혀 모르는 사람이 뒤따라와 둔기로 머리를 내리치고 폭행했는데 묻지마 범행이 아니라고 하니 이해할 수 없다"며 "살해 동기가 없는데 그 시간에 둔기를 들고 다니겠나"라며 경찰 의견을 반박했다.    경찰은 이씨의 행적과 범행 동기를 추가로 조사하고서 공소권 없음 의견으로 사건을 검찰에 송치할 계획이다.    pulse@yna.co.kr']

[ '만삭 아내, 아들 앞에서 40대 공무원, 투신 공시생에 부딪혀 사망    (광주=연합뉴스) 정회성 기자 = \'서글 서글 웃는 모습에서 성실함이 묻어나오는 공무원, 누구에게든 고개 숙여 친절을 베푸는 사람\'    전남 곡성군의 한 홍보담당 공무원은 최근 영화 \'곡성\' 개봉으로 곡성군이 전국의 이슈가 되자 "곡성군을 제대로 알릴 기회가 찾아왔다"며 폭염이 내리쬐는 축제장을 진땀을 흘리며 뛰어다녔다.    10일 동안 이어진 축제를 치르며 매일 밤늦은 퇴근길에 오른 그의 등 위에는 \'소금꽃\'이 하얗게 피었다.    그런 공무원 가장의 생명을 공무원시험 준비생의 안타까운 선택이 송두리째 앗아갔다.    지난달 31일 오후 9시 48분께 광주 북구의 한 고층 아파트에서 대학생 A(25) 씨가 건물 바깥으로 몸을 던졌다.    같은 시각 이 아파트 입구에는 야근을 마치고 집으로 돌아가던 전남 곡성군청 홍보담당 양모(38) 주무관이 걸음을 옮기고 있었다.    버스정류장까지 마중 나온 만삭의 아내, 5살 아들은 가장 B 씨의 뒤를 따라 걷고 있었다.    출산 두 달여 앞둔 아내의 눈앞에서 20층에서 바닥을 향해 곤두박질친 A씨가 남편을 덮쳤다.    머리를 심하게 다친 두 사람은 119구급대에 의해 병원으로 옮겨졌지만 숨을 거뒀다.    비극이 일어난 아파트 20층 복도에는 A4 2장 분량의 쪽지와 술이 절반가량 담긴 양주병이 남아 있었다.    A 씨가 손으로 써내려간 쪽지에는 \'태어나서 무언가를 쉽게 성취한 적이 없는데 왜 남들은 쉽게 행복할까\', \'본심 아닌 주위 시선에 신경 쓰여서 보는 공무원시험 외롭다\' 등 처지를 비관하는 글들이 빼곡하게 적혀 있었다.    A 씨는 유서로 전한 마지막 이야기에 평온한 일상을 향한 염원을 드러냈지만, 그의 잘못된 선택은 한 가족의 행복을 송두리째 빼앗고 말았다.    \'차분하고 논리적이고 성실한 사람, 아까운 인재, 광주에서 시외버스를 타고 출퇴근하면서도 지각 한 번 없던 사람\'    전날까지도 밝은 표정으로 인사했던 양 주무관의 죽음을 믿을 수 없다며 직장 동료들이 전한 기억이다.    2008년 공직에 입문한 양씨는 2014년 7월부터 홍보업무를 담당했다.    매일 아침 언론보도 수집과 분석을 위해 오전 8시 전에 출근했고, 보도자료 작성 및 소식지 발간 작업으로 광주행 막차시간에 맞춰 퇴근하기 일쑤였다.    최근 곡성에서 열리는 장미축제가 영화 \'곡성(哭聲)\'의 영향으로 새삼 주목받으면서 그는 더욱 헌신적으로 일했다.    다른 동료공무원보다 일찍 출근해 아침 신문을 차곡차곡 오려 정리했고, 밤늦게까지 축제 관련 아이템을 발굴하거나 아름다운 곡성 사진을 추려 기자들에게 보냈다.    거의 매일같이 곡성의 소식을 전하기 위해 방문한 기자들을 안내하면서도 힘들다는 말 한마디 없이 \'웃음꽃\'을 피웠다.    그런 양 씨의 페이스북에는 곡성에 대한 기사가 빼곡히 올려져 있어 그의 곡성에 대한 사랑을 느끼기 충분했다.    양 씨는 건실한 가장이기도 했다.    만삭의 아내와 아들을 집에 두고 외벌이에 나선 그는 고된 업무에도 한 푼이라도 아끼기 위해 자가용 대신 대중교통을 이용했다.     사망 당일에도 오후 8시 46분까지 일한 양 씨는 가족의 곁으로 돌아가기 위해 광주행 막차에 올랐다.     한 동료는 "고인은 성실한 공무원이자 자상한 가장이었다"며 "최근 업무가 많아 이날도 늦게 퇴근했다"고 말했다.    안타깝게도 양 씨는 공직에 몸담은 지 8년여밖에 안 돼 불의의 사고로 숨지고도 연금 수급 대상자가 아닌 것으로 전해졌다.     곡성군은 이를 고려해 양 씨의 순직을 신청할 방침이다.    경찰은 그를 죽음에 이르게 한 A 씨에 대해 과실치사 혐의 적용을 검토하고 있다.    사건은 검찰에 송치되더라도 당사자가 숨져 \'공소권 없음\'으로 종결되지만, 보험이나 보상 처리 과정에서 도움될 것으로 보인다.    hs@yna.co.kr']

[ '진중권 "훼손한 사람들이야말로 민주주의의 적"    (서울=연합뉴스) 안홍석 기자 = 서울 마포구 홍익대 정문 근처에 앞에 설치된 \'일베\' 상징 조형물이 1일 크게 훼손되면서 논란이 일고 있다.    홍익대 정문에는 지난달 30일 극우 성향의 인터넷 커뮤니티 \'일간베스트(일베)\'에서 일베를 상징하는 것으로 통하는 손가락 모양의 대형 조형물이 등장했다.    조형물 사진이 SNS 등으로 널리 퍼져나가면서 작가가 일베를 옹호하는 게 아니냐는 비난 여론이 일었다. 작품에는 철거를 요구하는 쪽지가 붙었고, 급기야는 계란이 던져지기도 했다.    이 작품은 이 대학 조소과 4학년 홍기하씨가 학과 \'환경조각연구 야외조각전\'에 출품하려고 과제로 제작한 작품이었다.     이달 20일까지 전시될 예정이었으며 작품 이름은 \'어디에나 있고, 아무 데도 없다\'다.    비난 여론이 거세지자 홍씨는 31일 입장문을 내고 "작품은 내가 일베를 옹호하느냐, 비판하느냐를 단정짓는 이분법적인 의도를 담고 있지 않다. 사회에 만연하게 존재하지만 실체가 없는 일베라는 것을 실제로 보여줌으로써 이에 대한 논란과 논장을 벌이는 것이 작품 의도이고 이 사회의 현실을 반영하고 있다고 생각한다"고 의도를 설명했다.    이어 "의도에 대한 마녀사냥식 비판, 거짓된 정보들, 그리고 작품을 훼손하는 행위도 일베가 하는 것과 다른 점이 무엇인가를 생각해 볼 수 있는 지점"이라면서 "작품을 훼손하는 것도 표현의 자유라고 생각하겠지만 그에 대한 책임을 져야 할 것"이라고 말했다.    비난 여론은 수그러들지 않았고 해당 조형물은 1일 오전 쓰러지고 손가락 부위가 훼손된 채 발견됐다. 조형물에는 "예술과 표현의 자유는 절대적인 권리가 아님을..."이라는 메모가 붙어있었다.    이어 한 인터넷 커뮤니티에는 \'홍대 일베석상 파괴 전말\'이라는 제목의 글이 게시됐다. 이 글 작성자는 자신이 조형물을 파괴했다면서 "우발적이 아니라 계획된 행동이다. 작가나 학교측이 법적인 책임을 묻는다면 떳떳하게 책임을 지겠다"고 말했다.    미학자인 진중권 동양대 교수는 트위터에서 "일베보다 더 무서운 게 이런 짓 하는 놈들"이라면서 조형물을 훼손한 사람들을 강하게 비판했다.    진 교수는 이어 "작가의 의도와 상관없이 작품에 \'일베 옹호\'라는 딱지를 붙이는 해석적 폭력에 물리력을 동원한 실력 행사까지… 어떤 대의를 위해서 남의 표현의 자유를 폭력적으로 짓밟아도 된다고 믿는 자들이야말로 민주주의의 적"이라고 썼다.    ahs@yna.co.kr']


In [88]:
def userList(comment_count=15):
    user_groups = comment_df.groupby("userIdNo")

    df = pd.DataFrame([
            {
                "count": len(user_groups.get_group(userIdNo)),
                "userIdNo":userIdNo,
            }
            for userIdNo
            in comment_df["userIdNo"].unique()
        ])
    df = df.sort_values("count", ascending=False).reset_index(drop=True)
    return list(df[df["count"] > comment_count]["userIdNo"]), list(df[df["count"] > comment_count]["count"])

In [89]:
%time userList()


CPU times: user 13.4 s, sys: 162 ms, total: 13.5 s
Wall time: 13.5 s
Out[89]:
(0     28qA1
 1     7G80r
 2     85fbU
 3     3EQjn
 4      Iqis
 5      jE62
 6     5UM3g
 7     6j7iu
 8     3Bpiw
 9     6ij6t
 10    20689
 11    5CNxc
 12    1oi4I
 13     c3M1
 14    3RPDj
 15    69dyJ
 16    5WZJY
 17     Y7TF
 18    29AdA
 19     mNSt
 20    3AaoK
 21    43EbU
 22    5GXYo
 23    3sqs8
 24     ANbk
 25     YflC
 26    4MNpc
 27    6Ru2h
 28    1ads2
 29    4211N
 30    2QEHh
 31    7ewFK
 32     HRdY
 33    67HKN
 34     Olkz
 35    1wGPL
 36    3z9g1
 37     y4ft
 38    3IQFB
 39    2TtHR
 40    1jRYN
 41    4dnYc
 42    2LcqK
 43    2nsHs
 44    6e9Z2
 45    4HjJ4
 46    502bK
 47     pAdy
 48    3GUzq
 49    79PF0
 50    1sMbc
 51    6izQ0
 52    7PyPB
 53    6EM7l
 54    4fSbH
 55    3RrI7
 56     UCx0
 57    5DnkR
 58    1fTr6
 59    2wBIk
 Name: userIdNo, dtype: object, 0     20
 1     20
 2     20
 3     20
 4     19
 5     19
 6     19
 7     19
 8     19
 9     19
 10    19
 11    18
 12    18
 13    18
 14    18
 15    18
 16    18
 17    18
 18    18
 19    18
 20    18
 21    18
 22    18
 23    18
 24    18
 25    18
 26    18
 27    17
 28    17
 29    17
 30    17
 31    17
 32    17
 33    17
 34    17
 35    17
 36    17
 37    17
 38    17
 39    17
 40    16
 41    16
 42    16
 43    16
 44    16
 45    16
 46    16
 47    16
 48    16
 49    16
 50    16
 51    16
 52    16
 53    16
 54    16
 55    16
 56    16
 57    16
 58    16
 59    16
 Name: count, dtype: int64)

In [92]:
def remove_duplicate(list1, list2):
    for idx in list2:
        list1 = [x for x in list1 if x != idx]
    return list1

In [ ]: