class TestTextrankr(unittest.TestCase): def setUp(self): self.text = "트위터, \"정보당국에 데이터 분석자료 팔지 않겠다\". 트위터가 수많은 트윗을 분석해 정보를 판매하는 서비스를 미국 정보당국에는 제공하지 않기로 했다. 월스트리트저널은 미국 정보당국 관계자 등을 인용해 데이터마이너(Dataminer)가 정보당국에 대한 서비스는 중단하기로 했다고 9일(현지시간) 보도했다. 트위터가 5% 지분을 가진 데이터마이너는 소셜미디어상 자료를 분석해 고객이 의사결정을 하도록 정보를 제공하는 기업이다. 트위터에 올라오는 트윗에 실시간으로 접근해 분석한 자료를 고객에게 팔 수 있는 독점권을 갖고 있다. 정보당국은 이 회사로부터 구매한 자료로 테러나 정치적 불안정 등과 관련된 정보를 획득했다. 이 회사가 정보당국에 서비스를 판매하지 않기로 한 것은 트위터의 결정인 것으로 알려졌다. 데이터마이너 경영진은 최근 “트위터가 정보당국에 서비스하는 것을 원치 않는다”고 밝혔다고 이 신문은 전했다. 트위터도 성명을 내고 “정보당국 감시용으로 데이터를 팔지 않는 것은 트위터의 오래된 정책”이라며 “트위터 자료는 대체로 공개적이고 미국 정부도 다른 사용자처럼 공개된 어카운트를 살펴볼 수 있다”고 해명했다. 그러나 이는 이 회사가 2년 동안 정보당국에 서비스를 제공해 온 데 대해서는 타당한 설명이 되지 않는다. 트위터의 이번 결정은 미국의 정보기술(IT)기업과 정보당국 간 갈등의 연장 선상에서 이뤄진 것으로 여겨지고 있다. IT기업은 이용자 프라이버시에 무게 중심을 두는 데 비해 정보당국은 공공안전을 우선시해 차이가 있었다. 특히 애플은 캘리포니아 주 샌버너디노 총격범의 아이폰에 저장된 정보를 보겠다며 데이터 잠금장치 해제를 요구하는 미 연방수사국(FBI)과 소송까지 진행했다. 정보당국 고위 관계자도 “트위터가 정보당국과 너무 가까워 보이는 것을 우려하는 것 같다”고 말했다. 데이터마이너는 금융기관이나, 언론사 등 정보당국을 제외한 고객에 대한 서비스는 계속할 계획이다. ." self.textrank = TextRank(self.text) def test_ranked(self): results = self.textrank.summarize(3, verbose=False) self.assertEqual(len(results), 3) self.assertEqual(results[0], "트위터, \"정보당국에 데이터 분석자료 팔지 않겠다\".") def test_verbose(self): result = self.textrank.summarize(1, verbose=True) self.assertEqual(result, "트위터, \"정보당국에 데이터 분석자료 팔지 않겠다\".") def test_sentence(self): sent = self.textrank.sentences[0] self.assertEqual(str(sent), "트위터, \"정보당국에 데이터 분석자료 팔지 않겠다\".")
def summarize_text(text): # < workaround cooes > for crash problem with django and konlpy # - related issue : https://github.com/konlpy/konlpy/issues/104 if jpype.isJVMStarted(): jpype.attachThreadToJVM() # < workaround codes end!!! > #print_with_timestamp("textrank init") _textrank = TextRank(text) #print_with_timestamp("textrank init end") return _textrank.summarize()
def summerize(event, context): if not event['body']: return {"statusCode": 400, "body": ""} textrank = TextRank(event['body'], phraser=ApiPhraser(api_url=phraser_api_url).phrases) response = { "statusCode": 200, "body": textrank.summarize(), "headers": { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "POST" } } return response
def summareader(): url = "https://news.naver.com" context = ssl._create_unverified_context() response = urlopen.urlopen(url, context=context) objBS = bs4.BeautifulSoup(response, "html.parser") news_item = objBS.find_all("ul", {"class": "section_list_ranking"}) naverurl = [] newstitle = [] article = [] for nws in news_item: txt = nws.find_all("a") for we in txt: k = "https://news.naver.com" + we.get('href') title = we.text.strip() naverurl.append(k) newstitle.append(title) for i in range(len(naverurl)): url = naverurl[i] context2 = ssl._create_unverified_context() response2 = urlopen.urlopen(url, context=context) objBS2 = bs4.BeautifulSoup(response2, "html.parser") newstime = str(objBS2.select('.t11')) newstime = re.sub('<.+?>', '', newstime, 0, re.I | re.S) newscontent = str( objBS2.find("div", {"class": "_article_body_contents"})) newscontent = re.sub('<script.*?>.*?</script>', '', newscontent, 0, re.I | re.S) text = re.sub('<.+?>', '', newscontent, 0, re.I | re.S) articlecontent = text textrank = TextRank(articlecontent) suma = textrank.summarize(3) article.append(suma) print(article[i]) print( "--------------------------------------------------------------------------------------------" ) return newstitle, article
def summareader(): url="https://news.naver.com" context=ssl._create_unverified_context() response=urlopen.urlopen(url, context=context) objBS= bs4.BeautifulSoup(response, "html.parser") news_item=objBS.find_all("ul",{"class":"section_list_ranking"}) naverurl=[] newstitle=[] article=[] for nws in news_item: txt=nws.find_all("a") for we in txt: k = "https://news.naver.com"+we.get('href') title=we.text.strip() naverurl.append(k) newstitle.append(title) for i in range(len(naverurl)): news = Article(naverurl[i], language='ko') news.download() news.parse() textrank = TextRank(news.text) suma=textrank.summarize(3) article.append(suma) # print(article[i],"\n-----------------------------------------------------------------------------------\n") # print(newstitle[i], "\n-----------------------------------------------------------------------------------\n") return newstitle, article # test = summareader() # print(test[0][0]) # print(test[1][0])
def summarize_text(text): # < workaround cooes > for crash problem with django and konlpy # - related issue : https://github.com/konlpy/konlpy/issues/104 if jpype.isJVMStarted(): jpype.attachThreadToJVM() # < workaround codes end!!! > #print_with_timestamp("textrank init") #ignore_words = ["@newsworks.kr"] ignore_words = [] _textrank = TextRank(text, ignore_words) previous_sentence = "" for s in _textrank.get_sentences(): if len(previous_sentence) > 0 and previous_sentence == s: return "" if len(s) > SENTENCE_MAX_SIZE: return "" previous_sentence = s #print_with_timestamp("textrank init end") return _textrank.summarize()
line_modify = [] content = "" line_modify.append(line[0]) #line_modify.append(line[1]) line_modify.append(re.sub('[^0-9a-zA-Zㄱ-힗 .]', ' ', line[1])) # 기사 맨 뒤 이메일 삭제 reversed_content = ''.join(reversed(line[2])) for i in range(0, len(line[2])): # reverse 된 기사 내용중, ".다"로 끝나는 경우 기사 내용이 끝난 것이기 때문에 기사 내용이 끝난 후의 광고, 기자 등의 정보는 다 지움 if reversed_content[i:i + 2] == '.다': content = ''.join(reversed(reversed_content[i:])) break content = content.replace('.', '. ') line_modify.append(re.sub('[^0-9a-zA-Zㄱ-힗 .]', ' ', content)) text = TextRank(content) text = text.summarize() text = re.sub('[^0-9a-zA-Zㄱ-힗 .]', ' ', text) line_modify.append(text) print(text) line_modify.append(line[3]) writer.writerow(line_modify) f.close() f2.close()
def test_ranked(self): textrank = TextRank(self.text) self.assertEqual(textrank.summarize(1), "트위터, \"정보당국에 데이터 분석자료 팔지 않겠다\".")
from __future__ import print_function from textrankr import TextRank textrank = TextRank("시는 인간의 삶을 반영한다. 시에서 반영은 현실과 인생을 모방한다는 의미에서 외부 현실을 시 속에 담아내는것으로, 역사와 현실의 상황을 시를 통해 어떻게 재현할것인가에 초점을 둔다. 여기서 반영은 ‘있는 그대로의 현실’로서의 반영과 ‘있어야 하는 현실’로서의 반영으로 구분할수 있다. 전자는 역사와 현실의 모습을 사실 그대로 보여주는 일상적 진실을 반영하는 것을 말하고, 후자는 일상적현실을 넘어 화자가 지향하는 당위적 진실을 반영하는 것을말한다.") print(textrank.summarize())
def summarize_text(text): jpype.attachThreadToJVM() textrank = TextRank(text) return textrank.summarize()
def tokenize(doc): return [''.join(t) for t in pos_tagger2.phrases(doc)] # In[7]: def term_exists(doc): return {'{}'.format(word): (word in set(doc)) for word in tokens} # In[15]: text = select_sentence() textrank = TextRank(text) main_sentences = textrank.summarize(5).split('\n') random.shuffle(main_sentences) main_sentence = main_sentences.pop() main_sentence2 = main_sentences.pop() main_sentence3 = main_sentences.pop() # In[20]: pos_tagger2 = Okt() trainSet = select_sentence_by_keyword() train_docs = [(tokenize(row[0]), row[1]) for row in trainSet] tokens = [t for d in train_docs for t in d[0]] train_xy = [(term_exists(d), c) for d, c in train_docs] classifier = nltk.NaiveBayesClassifier.train(train_xy)
def summarizeTextRank(text, max=3): tr = TextRank(text) return tr.summarize(max)
def test_ranked(self): textrank = TextRank(self.text) print(textrank.summarize())