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 parse_link(url): req = requests.get(url) soup = bs(req.text, 'html.parser') title = str( soup.find('h3', { 'class': 'ending_tit_new' }).find('img')['alt']) img_url = soup.find('span', {'class': 'img_wrap2'}) if img_url: img_url = str(img_url.find('img')['src']) soup = soup.find('div', {'class': 'na_doc'}) [tag.extract() for tag in soup.find_all('caption')] [tag.extract() for tag in soup.find_all('p', {'class': 'cap'})] [tag.extract() for tag in soup.find_all('div', {'class': 'tmp_source2'})] [tag.extract() for tag in soup.find_all('div', {'id': 'na_author_top'})] [tag.extract() for tag in soup.find_all('div', {'class': 't_pdate'})] [tag.extract() for tag in soup.find_all('div', {'class': 'na_cmt_bx'})] [tag.extract() for tag in soup.find_all('', {'style': 'display:none'})] text_all = ' '.join(soup.get_text().split()) ret = list() ret.append(title) ret.append(url) ret.append(img_url) import jpype if jpype.isJVMStarted(): jpype.attachThreadToJVM() ret.append(TextRank(text_all).summarize().split('\n')) return ret
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 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 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()
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 total_work(total_train): new_text = [] mytokenizer: MyTokenizer = MyTokenizer() textrank: TextRank = TextRank(mytokenizer) for i in range(0, len(total_train)): if (total_train.loc[i, "문장 개수"] >= 8): k: int = 8 summarized: str = textrank.summarize(total_train.loc[i, "시"], k) new_text.append(summarized + "\n") else: m = (7 - total_train.loc[i, "문장 개수"]) // 2 + 1 k = total_train.loc[i, "문장 개수"] main_summarized: str = textrank.summarize(total_train.loc[i, "시"], m) summarized: str = textrank.summarize(total_train.loc[i, "시"], k) if (m > 2): main_list = main_summarized.split("\n") for i in range(0, m): summarized = summarized.replace(main_summarized[i], "") new_text.append(main_summarized + "\n" + summarized + "\n" + main_summarized + "\n") else: new_text.append(main_summarized + "\n" + summarized + "\n" + main_summarized + "\n") text_model = markovify.NewlineText(new_text, state_size=2) lyrics = [] for i in range(8): lyrics.append(text_model.make_sentence()) lyrics = list(filter(lambda a: a != None, lyrics)) final = [] for i in range(0, len(lyrics)): if len(lyrics[i]) > 50: final.append(lyrics[i][:50]) final.append(lyrics[i][50:]) else: final.append(lyrics[i]) if not final: total_work(total_train) else: return final return final
def textfile_similarity(): data = request.get_json() data = text_parse_sen(data) mytokenizer: MyTokenizer = MyTokenizer() textrank: TextRank = TextRank(mytokenizer) k: int = 3 # num sentences in the resulting summary summarized: str = textrank.summarize(data, k) # print(summarized) # gives you some text # if verbose=False, it returns a list summaries: List[str] = textrank.summarize(data, k, verbose=False) # for summary in summaries: # print(summary) if request.method == 'POST': return json.dumps(summaries, ensure_ascii=False) return '3sentence'
def parse_link(url): req = requests.get(url) soup = bs(req.text, 'html.parser') title = str(soup.find('h3', {'class': 'ending_tit_new'}).find('img')['alt']) img_url = soup.find('span', {'class': 'img_wrap2'}) if img_url: img_url = str(img_url.find('img')['src']) soup = soup.find('div', {'class': 'na_doc'}) [tag.extract() for tag in soup.find_all('p', {'class': 'cap'})] [tag.extract() for tag in soup.find_all('caption')] dl = soup.find('dl', {'class': 'na_reference'}) if not dl: dl = soup.find('div', {'id': 'na_author_top'}) if not dl: [tag.extract() for tag in [tag for tag in dl.next_elements]] text_all = str(soup) helper = HTML2Text() helper.ignore_links = True helper.ignore_images = True helper.ignore_tables = True text_all = helper.handle(text_all) for ch in ['#', '/', '*', '_', '>', '>', '<', ';', ':', '\\']: text_all = text_all.replace(ch, ' ') text_all = ' '.join(text_all.split()) ret = list() ret.append(title) ret.append(url) ret.append(img_url) import jpype if jpype.isJVMStarted(): jpype.attachThreadToJVM() ret.append(TextRank(text_all).summarize().split('\n')) return ret
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 setUp(self) -> None: self.text: str = "트위터, \"정보당국에 데이터 분석자료 팔지 않겠다\". 트위터가 수많은 트윗을 분석해 정보를 판매하는 서비스를 미국 정보당국에는 제공하지 않기로 했다. 월스트리트저널은 미국 정보당국 관계자 등을 인용해 데이터마이너(Dataminer)가 정보당국에 대한 서비스는 중단하기로 했다고 9일(현지시간) 보도했다. 트위터가 5% 지분을 가진 데이터마이너는 소셜미디어상 자료를 분석해 고객이 의사결정을 하도록 정보를 제공하는 기업이다. 트위터에 올라오는 트윗에 실시간으로 접근해 분석한 자료를 고객에게 팔 수 있는 독점권을 갖고 있다. 정보당국은 이 회사로부터 구매한 자료로 테러나 정치적 불안정 등과 관련된 정보를 획득했다. 이 회사가 정보당국에 서비스를 판매하지 않기로 한 것은 트위터의 결정인 것으로 알려졌다. 데이터마이너 경영진은 최근 “트위터가 정보당국에 서비스하는 것을 원치 않는다”고 밝혔다고 이 신문은 전했다. 트위터도 성명을 내고 “정보당국 감시용으로 데이터를 팔지 않는 것은 트위터의 오래된 정책”이라며 “트위터 자료는 대체로 공개적이고 미국 정부도 다른 사용자처럼 공개된 어카운트를 살펴볼 수 있다”고 해명했다. 그러나 이는 이 회사가 2년 동안 정보당국에 서비스를 제공해 온 데 대해서는 타당한 설명이 되지 않는다. 트위터의 이번 결정은 미국의 정보기술(IT)기업과 정보당국 간 갈등의 연장 선상에서 이뤄진 것으로 여겨지고 있다. IT기업은 이용자 프라이버시에 무게 중심을 두는 데 비해 정보당국은 공공안전을 우선시해 차이가 있었다. 특히 애플은 캘리포니아 주 샌버너디노 총격범의 아이폰에 저장된 정보를 보겠다며 데이터 잠금장치 해제를 요구하는 미 연방수사국(FBI)과 소송까지 진행했다. 정보당국 고위 관계자도 “트위터가 정보당국과 너무 가까워 보이는 것을 우려하는 것 같다”고 말했다. 데이터마이너는 금융기관이나, 언론사 등 정보당국을 제외한 고객에 대한 서비스는 계속할 계획이다. ." self.tokenizer: OktTokenizer = OktTokenizer() self.textrank: TextRank = TextRank(self.tokenizer)
for sent1, sent2 in combinations(self.sentences, 2): weight = self._jaccard(sent1, sent2) if weight: self.graph.add_edge(sent1, sent2, weight=weight) def _jaccard(self, sent1, sent2): p = sum((sent1.bow & sent2.bow).values()) q = sum((sent1.bow | sent2.bow).values()) return p / q if q else 0 def summarize(self, count=3, verbose=True): results = sorted(self.reordered[:count], key=lambda sentence: sentence.index) results = [result.text for result in results] if verbose: return '\n'.join(results) else: return results from textrankr import TextRank if __name__ == '__main__': text = '' f = open('file.txt', 'r') for line in f: text = text + line # print(text) textrank = TextRank(text) print(textrank.summarize()) f.close()
from typing import List from textrankr import TextRank from konlpy.tag import Okt class OktTokenizer: okt: Okt = Okt() def __call__(self, text: str) -> List[str]: tokens: List[str] = self.okt.phrases(text) return tokens okt_tokenizer: OktTokenizer = OktTokenizer() textrank: TextRank = TextRank(okt_tokenizer) # num sentences in the resulting summary k: int = 5 with open('../data/test1_punct.txt', 'r') as f: text = f.read().split('\n') text = ' '.join(text) # summarized: str = textrank.summarize(text, k) # print(summarized) # if verbose=False, it returns a list summaries: List[str] = textrank.summarize(text, k, verbose=False) for i, summary in enumerate(summaries): print(i, summary)
def test_ranked(self): textrank = TextRank(self.text) print(textrank.summarize())
def decode(self, text, count=3): return TextRank(text).summarize(count)
def test_ranked(self): textrank = TextRank(self.text) self.assertEqual(textrank.summarize(1), "트위터, \"정보당국에 데이터 분석자료 팔지 않겠다\".")
from lexrankr import LexRank import asyncio from contextlib import suppress import queue #from html2text import html2text # workaround preloading kkma in konlpy # kkma 형태소 분석기 로딩이 엄청 오래 걸림... ( 10초? ) ######################################### if jpype.isJVMStarted(): jpype.attachThreadToJVM() _textrank = TextRank("test") ######################################### 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 summarizeTextRank(text, max=3): tr = TextRank(text) return tr.summarize(max)
from __future__ import print_function from textrankr import TextRank # 이거 아님, 이건 엔터가 없으면 구분이 안됨 ! textrank = TextRank(''' 육아의 필수품이 된 물티슈가 알레르기의 원인이 될 수 있다는 연구 결과가 나왔다. 미국 노스웨스턴대학교 연구진은 물티슈로 아기를 닦으면 피부에 남은 비누기(라우릴황산나트륨 등 계면활성제)가 보호막 역할을 하는 기름기(지질)를 없애 아기들에게 알레르기가 생기기 쉽다고 밝혔다. 특히 이번 연구에서 주목할 점은 유전적으로 피부가 약한 아기들에게 물티슈의 화학물질은 식품 알레르기의 원인이 될 수 있다는 것이다. 조앤 쿡 밀스 교수는 '유전자, 먼지와 음식, 그리고 물티슈는 유아 알레르기의 '더 할 수 없이 나쁜 상황(perfect storm)'이다'라고 말했다. 연구에 따르면 알레르기가 있는 아이들은 피부 보호막을 약하게 하는 세 가지 돌연변이 유전자가 있었다. 그러나 해당 유전자를 가졌다고 해서 모두 식품 알레르기 반응을 보인 것은 아니었다. 예컨대 해당 유전자를 가진 실험용 생쥐를 땅콩에 노출해도 별다른 반응이 나타나지 않았던 것. 연구진은 환경적 요인에 주목했다. 실험 끝에 연구진이 식품 알레르기를 유발하는 원인으로 지목한 것 중 하나가 물티슈였다. 연구진은 물티슈의 비누 성분이 피부의 보호막을 약하게 만들어 특히 유전적으로 취약한 아이들에게 나쁜 영향을 미치는 것을 발견했다. 연구진은 유전적 결함이 있는 아기들의 피부가 물티슈의 비누 성분을 접촉했을 때 먼지나 땅콩 등 알레르기 물질이 체내에 유입되기 쉽다고 지적했다. 이 경우 예컨대 땅콩버터 샌드위치를 먹은 누군가가 아기에게 접촉하는 것만으로도 알레르기가 생길 수 있다고 연구진은 경고했다. 연구진은 '신세대 부모들이 물티슈 사용을 줄이는 것이 바람직하다'면서 '가장 좋은 방법은 예전에 부모들이 그랬듯이 물로 씻기는 것'이라고 덧붙였다. ''') print(textrank.summarize(1)) print(textrank.summarize(1))
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]
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()
from __future__ import print_function from textrankr import TextRank import sys #textrank = TextRank("나는 프로그래머 입니다. 자바 프로그래머, 그냥 프로그래머"); #print(sys.argv[1]); textrank = TextRank(sys.argv[1]) print(textrank.summarize())