Skip to content

Commit

Permalink
degree centrality
Browse files Browse the repository at this point in the history
  • Loading branch information
GoncaloKLopes committed Dec 6, 2017
1 parent ef98106 commit 23836d3
Show file tree
Hide file tree
Showing 4 changed files with 198 additions and 38 deletions.
20 changes: 4 additions & 16 deletions ex2/2.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,6 @@
exec(open('priors.py').read())
exec(open('weights.py').read())

def build_graph_matrix(sentences,weight_func,t):
if not callable(weight_func):
return 'Not functions!'
nsents = len(sentences)
weights = np.zeros([nsents,nsents])

cos_matrix = get_cosine_similarities_matrix(sentences)
#create weights
for i in range(len(sentences)):
for j in range(len(sentences)):
weights[i][j] = weight_func(i,j,sentences,cos_matrix,t)
return weights

def build_priors(sentences,graph,prior_func):
if not callable(prior_func):
return 'Not functions!'
Expand Down Expand Up @@ -53,8 +40,9 @@ def rank(weights,priors,itermax,damping):
while i < itermax:
aux = pr
for j in range(nsents):
random = damping * (priors[j]/np.sum(priors))

random = damping * priors[j]
if random != 0:
random /= np.sum(priors)
not_random = (1 - damping) * prestige(j,pr,weights)
aux[j] = random + not_random
pr = aux
Expand Down Expand Up @@ -99,7 +87,7 @@ def build_summary(sentences,prior_func,weight_func,t):
with open(source_path + text_file,'r',encoding='Latin-1') as file: #source_path + text_file
text = file.read()
sentences = text_to_sentences(text)
summary = build_summary(sentences,uniform_prior,uniform_weight,thresh)
summary = build_summary(sentences,degree_centrality_prior,uniform_weight,thresh)
with open(sums_path+ 'Ext-' + text_file,'r',encoding='Latin-1') as summary_file: #sums_path+ 'Ext-' + text_file
MAP += AP(summary,summary_file.read())
MAP /= len(source_texts)
Expand Down
168 changes: 152 additions & 16 deletions ex2/Untitled1.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
"execution_count": 25,
"execution_count": 61,
"metadata": {
"collapsed": true
},
Expand Down Expand Up @@ -45,7 +45,7 @@
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 62,
"metadata": {
"collapsed": false
},
Expand All @@ -57,9 +57,9 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 63,
"metadata": {
"collapsed": true
"collapsed": false
},
"outputs": [],
"source": [
Expand All @@ -69,7 +69,7 @@
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": 64,
"metadata": {
"collapsed": false
},
Expand Down Expand Up @@ -110,29 +110,26 @@
},
{
"cell_type": "code",
"execution_count": 18,
"execution_count": 65,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
"name": "stdout",
"output_type": "stream",
"text": [
"['Massacre no Líbano.', 'Apanhado na dinâmica do olho por olho, dente por dente, Israel erra o alvo e mata 100 libaneses num campo de refugiados.', 'BEIRUTE - O confronto entre Israel e a guerrilha fundamentalista do Hisbolá (Partido de Deus) completou ontem oito dias de forma sangrenta.', 'Bombardeios da artilharia israelense contra o Sul do Líbano provocaram dois massacres: o primeiro, em Nabatié, matou 10 pessoas, entre elas um bebê de três dias.', 'O segundo, horas depois, atingiu uma base das Nações Unidas transformada em acampamento em Caná, nos arredores de Tiro, matando pelo menos 100 pessoas e ferindo mais de 190, quase todos civis, a maioria mulheres e crianças, que se haviam refugiado no local para escapar dos bombardeios israelenses.', 'O bombardeio israelense aconteceu em resposta a um ataque com foguetes Katyusha, lançados pelo Hisbolá de uma posição a 300 metros da base.', 'A rota dos foguetes foi refeita por radares israelenses, e 15 minutos depois Israel bombardeou em resposta, errando o alvo.', 'O Hisbolá negou que tivesse lançado foguetes de posições próximas à base da Força Provisória das Nações Unidas no Líbano (Unifil, das iniciais em inglês), acusando Israel, num comunicado divulgado em Beirute, de \"espalhar boatos falsos\".', 'Mas o ataque do Hisbolá foi confirmado por um porta-voz das Nações Unidas.', 'O massacre deixou indignada a população, arrasados até mesmo fotógrafos e cinegrafistas acostumados a registrar cenas semelhantes, e provocou imediata e vigorosa reação internacional.', 'Parentes da vítimas gritavam ao lado dos corpos, culpando Israel mas também acusando o Hisbolá, por ter atirado de local tão próximo ao campo sabendo que Israel costuma rastrear os ataques.', 'O primeiro-ministro israelense, Shimon Peres, disse lamentar o bombardeio, mas responsabilizou o Hisbolá pelo episódio.', '\"O único culpado é o Hisbolá, e se os sírios e os libaneses não impedirem ele vai provocar uma tragédia no Líbano\", afirmou o primeiro-ministro, durante entrevista coletiva à imprensa, em Tel Aviv.', 'Israel acusa o Líbano e a Síria de serem coniventes com os terroristas instalados em território libanês, de onde atacam constantemente alvos civis no Estado judeu.', 'Em entrevista à televisão francesa Antenne 2, o primeiro-ministro libanês, Rafic Hariri, declarou-se \"verdadeiramente comovido\" pelas declarações de Peres, e desafiou o premier israelense a mostrar \"coragem\", reconhecendo que o bombardeio foi \"um erro\".', 'Carnificina - Quinhentos civis libaneses se haviam refugiado no campo para fugir dos bombardeios israelenses ao Sul do Líbano.', 'O repórter Brent Sadler, da rede de TV a cabo CNN, falou de \"cenas terríveis de carnificina\".', 'Sadler, que esteve no local, contou que muitos fotógrafos e cinegrafistas baixaram as câmeras e começaram a chorar diante dos corpos mutilados de homens, mulheres e crianças.', 'Os feridos, entre eles alguns soldados da ONU, foram levados para hospitais de Tiro.', 'Antes do bombardeio contra Caná, um ataque da aviação israelense contra Nabatié, também no Sul do Líbano, destruiu uma casa, matando 10 pessoas, entre elas uma mãe e sete filhos.', 'Uma das crianças era um bebê, de apenas três dias.', 'O pai, em peregrinação a Meca, não chegou a conhecer o filho.', 'Apesar do choque provocado pela morte de tantos civis, Israel afirmou que pretende continuar os bombardeios.', '\"Acredito que a operação vá continuar, pelo menos por alguns dias, mas é impossível fixar um prazo.', 'Pode levar uma semana ou 10 dias\", disse o ministro do Exterior, Ehud Barak, ex-comandante militar, à rádio do exército israelense.', 'Alvos - Um porta-voz do governo israelense, Uri Dromi, reiterou que Israel não tem outra escolha, pois a prioridade é interromper os ataques de Katyushas contra o país.', 'Dromi afirmou que as operações parariam se foguetes parassem de cair.', '\"Mas o Hisbolá aumentou os ataques, em vez de cessá-los\", afirmou.', 'Os israelenses acusam o Hisbolá de se esconder atrás de civis.', 'Questionado por um repórter da CNN sobre o ataque a Nabatié, o chanceler Barak disse que Israel bombardeou a casa onde morreram vários civis porque momentos antes aviões israelenses tinham sido alvejados exatamente daquele local.', 'Quando o repórter perguntou a Barak sobre a promessa de não atacar o Hisbolá se houvesse perigo de matar civis, Barak respondeu que o piloto que bombardeou a casa não podia saber que havia civis lá.', 'Shimon Peres, que se reuniu com o presidente palestino Yasser Arafat ontem, reagiu ao ataque de Nabatié (o outro não havia ocorrido ainda) dizendo que pensava que a cidade estava vazia, que todos foram instruídos a deixar suas casas.', 'Mas os libaneses responderam a isso dizendo que não tinham para onde ir com seus filhos e perguntaram que direito Peres teria de mandá-los sair de suas casas.', 'O primeiro-ministro israelense disse que está disposto a aceitar o cessar-fogo proposto pelos EUA se o Hisbolá se comprometer a parar de atirar contra o Norte de Israel.', 'Em entrevista à CNN, de Damasco, na Síria, o primeiro-ministro libanês, Rafic Hariri, acusou Israel de obstruir as negociações.', '\"Não é o Líbano que está recusando uma solução política, é Peres\", disse Hariri.', '\"Veja o que está acontecendo.', 'Ele está matando inocentes e deixando o Hisbolá intacto\", afirmou.', 'Os ataques de Israel foram iniciados há nove dias, depois que foguetes Katyusha lançados pelo Hisbolá feriram 36 civis na cidade israelense de Kiriat Shmona.', 'Desde então, Israel vem bombardeando sistematicamente o Sul do Líbano, sem ter conseguido impingir grandes danos ao grupo terrorista - as baixas são praticamente todas civis.']\n"
]
}
],
"source": [
"sentences.index('massacre no líbano.')"
"print(sentences)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 68,
"metadata": {
"collapsed": false
},
Expand Down Expand Up @@ -342,6 +339,145 @@
"sorted(range(len(a)), key=lambda i: a[i], reverse=True)[:5]"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def uniform_prior(sent_index,graph,sentences):\n",
" return 1/len(sentences)\n",
"\n",
"#receives graph matrix for convenience...\n",
"def degree_centrality(sent_index,graph,sentences):\n",
"\tlinks = graph[sent_index]\n",
"\tnonzero = np.nonzero(links)[0]\n",
"\treturn len(nonzero)/len(links)"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def build_graph_matrix(sentences,weight_func,t):\n",
" if not callable(weight_func):\n",
" return 'Not functions!'\n",
" nsents = len(sentences)\n",
" weights = np.zeros([nsents,nsents])\n",
" \n",
" cos_matrix = get_cosine_similarities_matrix(sentences)\n",
" #create weights\n",
" for i in range(len(sentences)):\n",
" for j in range(len(sentences)):\n",
" weights[i][j] = weight_func(i,j,sentences,cos_matrix,t)\n",
" return weights\n",
"\n",
"#sentences is a list, returns cossim matrix\n",
"def get_cosine_similarities_matrix(sentences):\t\n",
"\tvec = TfidfVectorizer()\n",
"\n",
"\tX = vec.fit_transform(sentences)\n",
"\treturn cosine_similarity(X)\n",
"\n",
"#receives cossim matrix for performance reasons\n",
"#receives indexes for performance reasons aswell...\n",
"def cos_sim(sent1_index,sent2_index,cosine_matrix):\n",
" return cosine_matrix[sent1_index][sent2_index]\n",
"\n",
"def is_edge(sent1_index,sent2_index,cosine_matrix,t):\n",
"\treturn (cos_sim(sent1_index,sent2_index,cosine_matrix) >= t) and (sent1_index != sent2_index)\n",
"\n",
"def uniform_weight(sent1_index,sent2_index,sentences,cosine_matrix,t):\n",
"\tif is_edge(sent1_index,sent2_index,cosine_matrix,t):\n",
"\t\treturn 1\n",
"\telse:\n",
"\t\treturn 0"
]
},
{
"cell_type": "code",
"execution_count": 92,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(array([ 3, 3, 4, 5, 14, 15, 19, 20, 31, 32, 34, 38]), array([19, 20, 15, 38, 34, 4, 3, 3, 32, 31, 14, 5]))\n"
]
}
],
"source": [
"graph = build_graph_matrix(sentences,uniform_weight,0.25)\n",
"print(np.nonzero(graph))"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.05\n"
]
}
],
"source": [
"print(degree_centrality(3,graph,sentences))"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2\n"
]
}
],
"source": [
"print(len(np.nonzero(graph[3])[0]))"
]
},
{
"cell_type": "code",
"execution_count": 97,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0\n"
]
}
],
"source": [
"a = np.array(['a','b'])\n",
"print(np.where(a=='a')[0][0])"
]
},
{
"cell_type": "code",
"execution_count": null,
Expand Down
6 changes: 0 additions & 6 deletions ex2/priors.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,2 @@
def uniform_prior(sent_index,graph,sentences):
return 1/len(sentences)

#receives graph matrix for convenience...
def degree_centrality(sent_index,graph,sentences):
links = graph[sent_index]
nonzero = np.nonzero(links)
return len(nonzero)/len(links)
42 changes: 42 additions & 0 deletions functions.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import nltk
import nltk.data
import re
import numpy as np

from nltk.corpus import stopwords
from nltk.stem.porter import *
Expand Down Expand Up @@ -44,6 +45,47 @@ def get_cosine_similarities_matrix(sentences):
def cos_sim(sent1_index,sent2_index,cosine_matrix):
return cosine_matrix[sent1_index][sent2_index]

def degree_centrality(sent_index,sentences,t=0.2):
graph = build_graph_matrix(sentences,t)
return degree_centrality_prior(sent_index,graph,sentences)



#----------------------weights--------------------------------#
def is_edge(sent1_index,sent2_index,cosine_matrix,t):
return (cos_sim(sent1_index,sent2_index,cosine_matrix) >= t) and (sent1_index != sent2_index)

def uniform_weight(sent1_index,sent2_index,sentences,cosine_matrix,t):
if is_edge(sent1_index,sent2_index,cosine_matrix,t):
return 1
else:
return 0

#---------------------priors---------------------------------#
#receives graph matrix for convenience...
def degree_centrality_prior(sent_index,graph,sentences):
links = graph[sent_index]
nonzero = np.nonzero(links)[0]
return len(nonzero)/len(links)


#--------------------------graph building stuff------------------------#
def build_graph_matrix(sentences,weight_func=uniform_weight,t=0.2):
if not callable(weight_func):
return 'Not functions!'
nsents = len(sentences)
weights = np.zeros([nsents,nsents])

cos_matrix = get_cosine_similarities_matrix(sentences)
#create weights
for i in range(len(sentences)):
for j in range(len(sentences)):
weights[i][j] = weight_func(i,j,sentences,cos_matrix,t)
return weights




#-----------------Not being used---------------------------#
def stem_sentence(sentence):
stemmer = PorterStemmer()
Expand Down

0 comments on commit 23836d3

Please sign in to comment.