Summarizing articles on PMDD treatments using TextRank

In this blog post, I want to share with you what I learned about treating PMDD using articles summarization through TextRank. TextRank is not really a summarization algorithm, it is used for extracting top sentences, but I decided to use it anyways and see the results. I started by using the googlesearch library in python to search for “PMDD treatments – calcium, hormones, SSRIs, scientific evidence”. The search resulted in a list of URLs to various articles on PMDD treatments. However, not all of them were useful for my purposes, as some were blocked due to access restrictions. I used BeautifulSoup to extract the text from the remaining articles.

In order to exclude irrelevant paragraphs, I used the library called Justext. This library is designed for removing boilerplate content and other non-relevant text from HTML pages. Justext uses a heuristics to determine which parts of the page are boilerplate and which are not, and then filters out the former. Justext tries to identify these sections by analyzing the length of the text, the density of links, and the presence of certain HTML tags.

Some examples of the kinds of content that Justext can remove include navigation menus, copyright statements, disclaimers, and other non-content-related text. It does not work perfectly, as I still ended up with sentences such as the following in the resulting articles: “This content is owned by the AAFP. A person viewing it online may make one printout of the material and may use that printout only for his or her personal, non-commercial reference.”

Next, I used existing code that implements the TextRank algorithm that I found online. I slightly improved it so that instead of bag of words method the algorithm would use sentence embeddings. Let’s go step by step through the algorithm. I defined a class called TextRank4Sentences. Here is a description of each line in the __init__ method of this class:

self.damping = 0.85: This sets the damping coefficient used in the TextRank algorithm to 0.85. In this case, it determines the probability of the algorithm to transition from one sentence to another.

self.min_diff = 1e-5: This sets the convergence threshold. The algorithm will stop iterating when the difference between the PageRank scores of two consecutive iterations is less than this value.

self.steps = 100: This sets the number of iterations to run the algorithm before stopping.

self.text_str = None: This initializes a variable to store the input text.

self.sentences = None: This initializes a variable to store the individual sentences of the input text.

self.pr_vector = None: This initializes a variable to store the TextRank scores for each sentence in the input text.

from nltk import sent_tokenize, word_tokenize
from nltk.cluster.util import cosine_distance
from sklearn.metrics.pairwise import cosine_similarity

from sentence_transformers import SentenceTransformer

model = SentenceTransformer('distilbert-base-nli-stsb-mean-tokens')

MULTIPLE_WHITESPACE_PATTERN = re.compile(r"\s+", re.UNICODE)

class TextRank4Sentences():
    def __init__(self):
        self.damping = 0.85  # damping coefficient, usually is .85
        self.min_diff = 1e-5  # convergence threshold
        self.steps = 100  # iteration steps
        self.text_str = None
        self.sentences = None
        self.pr_vector = None

The next step is defining a private method _sentence_similarity() which takes in two sentences and returns their cosine similarity using a pre-trained model. The method encodes each sentence into a vector using the pre-trained model and then calculates the cosine similarity between the two vectors using another function core_cosine_similarity().

core_cosine_similarity() is a separate function that measures the cosine similarity between two vectors. It takes in two vectors as inputs and returns a similarity score between 0 and 1. The function uses the cosine_similarity() function from the sklearn library to calculate the similarity score. The cosine similarity is a measure of the similarity between two non-zero vectors of an inner product space. It is calculated as the cosine of the angle between the two vectors.

Mathematically, given two vectors u and v, the cosine similarity is defined as:

cosine_similarity(u, v) = (u . v) / (||u|| ||v||)

where u . v is the dot product of u and v, and ||u|| and ||v|| are the magnitudes of u and v respectively.

def core_cosine_similarity(vector1, vector2):
    """
    measure cosine similarity between two vectors
    :param vector1:
    :param vector2:
    :return: 0 < cosine similarity value < 1
    """
    sim_score = cosine_similarity(vector1, vector2)
    return sim_score

class TextRank4Sentences():
    def __init__(self):
        ...

    def _sentence_similarity(self, sent1, sent2):
        first_sent_embedding = model.encode([sent1])
        second_sent_embedding = model.encode([sent2])
        
        return core_cosine_similarity(first_sent_embedding, second_sent_embedding)

In the next function, the similarity matrix is built for the given sentences. The function _build_similarity_matrix takes a list of sentences as input and creates an empty similarity matrix sm with dimensions len(sentences) x len(sentences). Then, for each sentence in the list, the function computes its similarity with all other sentences in the list using the _sentence_similarity function. After calculating the similarity scores for all sentence pairs, the function get_symmetric_matrix is used to make the similarity matrix symmetric.

The function get_symmetric_matrix adds the transpose of the matrix to itself, and then subtracts the diagonal elements of the original matrix. In other words, for each element (i, j) of the input matrix, the corresponding element (j, i) is added to it to make it symmetric. However, the diagonal elements (i, i) of the original matrix are not added twice, so they need to be subtracted once from the sum of the corresponding elements in the upper and lower triangles. The resulting matrix has the same values in the upper and lower triangles, and is symmetric along its main diagonal. The similarity matrix is made symmetric in order to ensure that the similarity score between two sentences in the matrix is the same regardless of their order, and it also simplifies the computation.

def get_symmetric_matrix(matrix):
    """
    Get Symmetric matrix
    :param matrix:
    :return: matrix
    """
    return matrix + matrix.T - np.diag(matrix.diagonal())

class TextRank4Sentences():
    def __init__(self):
        ...

    def _sentence_similarity(self, sent1, sent2):
        ...
    
    def _build_similarity_matrix(self, sentences, stopwords=None):
        # create an empty similarity matrix
        sm = np.zeros([len(sentences), len(sentences)])
    
        for idx, sentence in enumerate(sentences):
            print("Current location: %d" % idx)
            sm[idx] = self._sentence_similarity(sentence, sentences)
    
        # Get Symmeric matrix
        sm = get_symmetric_matrix(sm)
    
        # Normalize matrix by column
        norm = np.sum(sm, axis=0)
        sm_norm = np.divide(sm, norm, where=norm != 0)  # this is ignore the 0 element in norm
    
        return sm_norm

In the next function, the ranking algorithm PageRank is implemented to calculate the importance of each sentence in the document. The similarity matrix created in the previous step is used as the basis for the PageRank algorithm. The function takes the similarity matrix as input and initializes the pagerank vector with a value of 1 for each sentence.

In each iteration, the pagerank vector is updated based on the similarity matrix and damping coefficient. The damping coefficient represents the probability of continuing to another sentence at random, rather than following a link from the current sentence. The algorithm continues to iterate until either the maximum number of steps is reached or the difference between the current and previous pagerank vector is less than a threshold value. Finally, the function returns the pagerank vector, which represents the importance score for each sentence.

class TextRank4Sentences():
    def __init__(self):
        ...

    def _sentence_similarity(self, sent1, sent2):
        ...
    
    def _build_similarity_matrix(self, sentences, stopwords=None):
        ...

    def _run_page_rank(self, similarity_matrix):

        pr_vector = np.array([1] * len(similarity_matrix))

        # Iteration
        previous_pr = 0
        for epoch in range(self.steps):
            pr_vector = (1 - self.damping) + self.damping * np.matmul(similarity_matrix, pr_vector)
            if abs(previous_pr - sum(pr_vector)) < self.min_diff:
                break
            else:
                previous_pr = sum(pr_vector)

        return pr_vector

The _get_sentence function takes an index as input and returns the corresponding sentence from the list of sentences. If the index is out of range, it returns an empty string. This function is used later in the class to get the highest ranked sentences.

class TextRank4Sentences():
    def __init__(self):
        ...

    def _sentence_similarity(self, sent1, sent2):
        ...
    
    def _build_similarity_matrix(self, sentences, stopwords=None):
        ...

    def _run_page_rank(self, similarity_matrix):
        ...

    def _get_sentence(self, index):

        try:
            return self.sentences[index]
        except IndexError:
            return ""

The code then defines a method called get_top_sentences which returns a summary of the most important sentences in a document. The method takes two optional arguments: number (default=5) specifies the maximum number of sentences to include in the summary, and similarity_threshold (default=0.5) specifies the minimum similarity score between two sentences that should be considered “too similar” to include in the summary.

The method first initializes an empty list called top_sentences to hold the selected sentences. It then checks if a pr_vector attribute has been computed for the document. If the pr_vector exists, it sorts the indices of the sentences in descending order based on their PageRank scores and saves them in the sorted_pr variable.

It then iterates through the sentences in sorted_pr, starting from the one with the highest PageRank score. For each sentence, it removes any extra whitespace, replaces newlines with spaces, and checks if it is too similar to any of the sentences already selected for the summary. If it is not too similar, it adds the sentence to top_sentences. Once the selected sentences are finalized, the method concatenates them into a single string separated by spaces, and returns the summary.

class TextRank4Sentences():
    def __init__(self):
        ...

    def _sentence_similarity(self, sent1, sent2):
        ...
    
    def _build_similarity_matrix(self, sentences, stopwords=None):
        ...

    def _run_page_rank(self, similarity_matrix):
        ...

    def _get_sentence(self, index):
        ...
   
    def get_top_sentences(self, number=5, similarity_threshold=0.5):
        top_sentences = []
    
        if self.pr_vector is not None:
            sorted_pr = np.argsort(self.pr_vector)
            sorted_pr = list(sorted_pr)
            sorted_pr.reverse()
    
            index = 0
            while len(top_sentences) < number and index < len(sorted_pr):
                sent = self.sentences[sorted_pr[index]]
                sent = normalize_whitespace(sent)
                sent = sent.replace('\n', ' ')
    
                # Check if the sentence is too similar to any of the sentences already in top_sentences
                is_similar = False
                for s in top_sentences:
                    sim = self._sentence_similarity(sent, s)
                    if sim > similarity_threshold:
                        is_similar = True
                        break
    
                if not is_similar:
                    top_sentences.append(sent)
    
                index += 1
        
        summary = ' '.join(top_sentences)
        return summary

The _remove_duplicates method takes a list of sentences as input and returns a list of unique sentences, by removing any duplicates in the input list.

class TextRank4Sentences():
    def __init__(self):
        ...

    def _sentence_similarity(self, sent1, sent2):
        ...
    
    def _build_similarity_matrix(self, sentences, stopwords=None):
        ...

    def _run_page_rank(self, similarity_matrix):
        ...

    def _get_sentence(self, index):
        ...
   
    def get_top_sentences(self, number=5, similarity_threshold=0.5):
        ...
    
    def _remove_duplicates(self, sentences):
        seen = set()
        unique_sentences = []
        for sentence in sentences:
            if sentence not in seen:
                seen.add(sentence)
                unique_sentences.append(sentence)
        return unique_sentences

The analyze method takes a string text and a list of stop words stop_words as input. It first creates a unique list of words from the input text by using the set() method and then joins these words into a single string self.full_text.

It then uses the sent_tokenize() method from the nltk library to tokenize the text into sentences and removes duplicate sentences using the _remove_duplicates() method. It also removes sentences that have a word count less than or equal to the fifth percentile of all sentence lengths.

After that, the method calculates a similarity matrix using the _build_similarity_matrix() method, passing in the preprocessed list of sentences and the stop_words list.

Finally, it runs the PageRank algorithm on the similarity matrix using the _run_page_rank() method to obtain a ranking of the sentences based on their importance in the text. This ranking is stored in self.pr_vector.

class TextRank4Sentences():
    ...

    def analyze(self, text, stop_words=None):
        self.text_unique = list(set(text))
        self.full_text = ' '.join(self.text_unique)
        #self.full_text = self.full_text.replace('\n', ' ')
        
        self.sentences = sent_tokenize(self.full_text)
        
        # for i in range(len(self.sentences)):
        #     self.sentences[i] = re.sub(r'[^\w\s$]', '', self.sentences[i])
    
        self.sentences = self._remove_duplicates(self.sentences)
        
        sent_lengths = [len(sent.split()) for sent in self.sentences]
        fifth_percentile = np.percentile(sent_lengths, 10)
        self.sentences = [sentence for sentence in self.sentences if len(sentence.split()) > fifth_percentile]

        print("Min length: %d, Total number of sentences: %d" % (fifth_percentile, len(self.sentences)) )

        similarity_matrix = self._build_similarity_matrix(self.sentences, stop_words)

        self.pr_vector = self._run_page_rank(similarity_matrix)

In order to find articles, I used the googlesearch library. The code below performs a Google search using the Google Search API provided by the library. It searches for the query “PMDD treatments – calcium, hormones, SSRIs, scientific evidence” and retrieves the top 7 search results.

# summarize articles
import requests
from bs4 import BeautifulSoup
from googlesearch import search
import justext
query = "PMDD treatments - calcium, hormones, SSRIs, scientific evidence"

# perform the google search and retrieve the top 5 search results
top_results = []
for url in search(query, num_results=7):
    top_results.append(url)

In the next part, the code extracts the article text for each of the top search results collected in the previous step. For each URL in the top_results list, the code sends an HTTP GET request to the URL using the requests library. It then uses the justext library to extract the main content of the webpage by removing any boilerplate text (i.e., non-content text).

article_texts = []

# extract the article text for each of the top search results
for url in top_results:
    response = requests.get(url)
    paragraphs = justext.justext(response.content, justext.get_stoplist("English"))
    text = ''
    for paragraph in paragraphs:
        if not paragraph.is_boilerplate:
            text += paragraph.text + '\n'

    if "Your access to PubMed Central has been blocked" not in text:
        article_texts.append(text.strip())
        print(text)
    print('-' * 50)
    
print("Total articles collected: %d" % len(article_texts))

In the final step, the extracted article texts are passed to an instance of the TextRank4Sentences class, which is used to perform text summarization. The output of get_top_sentences() is a list of the top-ranked sentences in the input text, which are considered to be the most important and representative sentences for summarizing the content of the text. This list is stored in the variable summary_text.

# summarize
tr4sh = TextRank4Sentences()
tr4sh.analyze(article_texts)
summary_text = tr4sh.get_top_sentences(15)

Results:
(I did not list irrelevant sentences that appeared in the final results, such as “You will then receive an email that contains a secure link for resetting your password…“)

Total articles collected: 6

There have been at least 15 randomized controlled trials of the use of selective serotonin-reuptake inhibitors (SSRIs) for the treatment of severe premenstrual syndrome (PMS), also called premenstrual dysphoric disorder (PMDD).

It is possible that the irritability/anger/mood swings subtype of PMDD is differentially responsive to treatments that lead to a quick change in ALLO availability or function, for example, symptom-onset SSRI or dutasteride.
* My note: ALLO is allopregnanolone
* My note: Dutasteride is a synthetic 4-azasteroid compound that is a selective inhibitor of both the type 1 and type 2 isoforms of steroid 5 alpha-reductase

From 2 to 10 percent of women of reproductive age have severe distress and dysfunction caused by premenstrual dysphoric disorder, a severe form of premenstrual syndrome.

The rapid efficacy of selective serotonin reuptake inhibitors (SSRIs) in PMDD may be due in part to their ability to increase ALLO levels in the brain and enhance GABAA receptor function with a resulting decrease in anxiety.

Clomipramine, a serotoninergic tricyclic antidepressant that affects the noradrenergic system, in a dosage of 25 to 75 mg per day used during the full cycle or intermittently during the luteal phase, significantly reduced the total symptom complex of PMDD.

Relapse was more likely if a woman stopped sertraline after only 4 months versus 1 year, if she had more severe symptoms prior to treatment and if she had not achieved full symptom remission with sertraline prior to discontinuation.

Women with negative views of themselves and the future caused or exacerbated by PMDD may benefit from cognitive-behavioral therapy. This kind of therapy can enhance self-esteem and interpersonal effectiveness, as well as reduce other symptoms.

Educating patients and their families about the disorder can promote understanding of it and reduce conflict, stress, and symptoms.

Anovulation can also be achieved with the administration of estrogen (transdermal patch, gel, or implant).

In a recent meta-analysis of 15 randomized, placebo-controlled studies of the efficacy of SSRIs in PMDD, it was concluded that SSRIs are an effective and safe first-line therapy and that there is no significant difference in symptom reduction between continuous and intermittent dosing.

Preliminary confirmation of alleviation of PMDD with suppression of ovulation with a GnRH agonist should be obtained prior to hysterectomy.

Sexual side effects, such as reduced libido and inability to reach orgasm, can be troubling and persistent, however, even when dosing is intermittent. * My note: I think this sentence refers to the side-effects of SSRIs


Observations on calcium and PMS/PMDD symptoms. Observaciónes sobre calcio y síntomas de SPM/TDPM.

After several visits to the doctor, I finally received references for hormone blood tests. I definitely do not regret spending time on doctor visits and laboratory tests, because it was really interesting to observe hormonal fluctuations throughout the cycle. The results clearly showed that my progesterone level quickly rises during the luteal phase, close to 50 nmol/l. One day/several days before menstruation, my progesterone drops to 1.8 nmol / l. At the peak, my progesterone was close to the top threshold. The level was not exactly abnormal, but research indicates that some women react negatively to changes in hormone levels.

Premenstrual dysphoric disorder (PMDD)  – a much more severe form of premenstrual syndrome (PMS). It may affect women of childbearing age. The exact cause of PMDD is not known. It may be an abnormal reaction to normal hormone changes that happen with each menstrual cycle. The hormone changes can cause a serotonin deficiency.

What is premenstrual dysphoric disorder (PMDD)?

I also came across an article in the Journal of Clinical Endocrinology & Metabolism, which states that there may be cyclical changes in calcium metabolism during the menstrual cycle in women with PMDD. Interesting points from the article:

  • Irritability, anxiety, and mania have been associated with hypocalcemia, whereas increased calcium concentrations have been noted in some patients with depression.
  • Three separate investigations have demonstrated that the dysphoria, anxiety, depression, and somatic symptoms of PMS all respond favorably to either increased dietary calcium intake or daily calcium supplementation
  • Increased calcium intake proved to benefit significantly all four major categories of PMS symptoms (negative affective symptoms, water retention symptoms, food cravings, and pain symptoms).
  • When compared with asymptomatic women, women with PMS were shown to have exaggerated fluctuations of the calcium-regulating hormones across the menstrual cycle with evidence of vitamin D deficiency and secondary hyperparathyroidism.

For the authors’ study – a total of 129 women completed the timed biochemical and hormone evaluation with 115 (68 PMDD and 47 controls) providing hormone data meeting criteria for analysis. Results – Although the screening baseline 24-h urine calcium was not found to be significantly different between the groups, the random urine calcium collections during hormonal sampling were significantly lower in the PMDD group compared with controls.

In the PMDD group, total serum calcium was found to be significantly lower at 3 points: at follicular phase 1 (menses) (9.17 ± 0.55 mg/dl, P < 0.001) compared with later phases 2, 3, and 4; at midcycle phase 3 (9.25 ± 0.55 mg/dl) compared with phase 2 (9.33 ± 0.58 mg/dl, P = 0.036); and during late luteal phase 5 (9.18 ± 0.73 mg/dl) compared with phase 4 (9.27 ± 0.55 mg/dl, P = 0.018). Ionized calcium did not fluctuate as dramatically as did total calcium, but a large difference was noted between early phases 1 and 2 of the menstrual cycle again with phase 1 having the lowest ionized calcium concentration (1.166 ± 0.072 vs. 1.175 ± 0.073 mmol/liter, P = 0.069). Intact PTH peaked in follicular phase 2 (56.9 ± 35.3 pg/ml) following the decline in serum calcium during phases 1 and 5. Follicular phase intact PTH was significantly higher than luteal phase concentrations and reached its nadir in luteal phase 4 (50.9 ± 34.4 pg/ml, P < 0.01). In conjunction with the follicular phase rise in intact PTH, serum pH was lower in the follicular phase 1 and 2 compared with midcycle phase 3 and luteal phase 4 (phase 1, 7.36 ± 0.004 vs. phase 3, 7.37 ± 0.023; P = 0.015; data not shown). The concentration of 1,25(OH)2D declined precipitously in luteal phase 4 and was significantly lower compared with all earlier phases (phase 4, 45.0 ± 27.5 vs. phase 3, 49.6 ± 27.5 pg/ml; P = 0.006). Urine calcium and 25OHD concentrations did not appear to vary between individual phases in the PMDD group.

Cyclical Changes in Calcium Metabolism across the Menstrual Cycle in Women with Premenstrual Dysphoric Disorder

 

*************************************************************************************

Después varias visitas al doctor, finalmente recibí referencias para análisis de sangre de hormonas. Definitivamente no me arrepiento de pasar tiempo en las visitas al médico y las pruebas de laboratorio, porque fue realmente interesante observar las fluctuaciones hormonales a lo largo de ciclo. Los resultados mostraron claramente que mi nivel de progesterona sube rápidamente durante la fase lútea, cerca de 50 nmol / l. Un día/ varios días antes la menstruacion, mi progesterona baja a 1.8 nmol / l. En el pico, mi progesterona estaba cerca del umbral superior. El nivel no era exactamente anormal, pero la investigación indica que algunas mujeres reaccionan negativamente a los cambios en los niveles hormonales.

Trastorno disfórico premenstrual (TDPM): una forma mucho más grave de síndrome premenstrual (SPM). Puede afectar a mujeres en edad fértil. La causa exacta de TDPM no se conoce. Puede ser una reacción anormal a los cambios hormonales normales que ocurren con cada ciclo menstrual. Los cambios hormonales pueden causar una deficiencia de serotonina.

También me encontré con un artículo en el Journal of Clinical Endocrinology & Metabolism, que establece que puede haber cambios cíclicos en el metabolismo del calcio durante el ciclo menstrual en mujeres con TDPM. Puntos interesantes del artículo:

  • La irritabilidad, la ansiedad y la manía se han asociado con hipocalcemia, mientras que se han observado concentraciones elevadas de calcio en algunos pacientes con depresión.
  • Tres investigaciones separadas han demostrado que la disforia, la ansiedad, la depresión y los síntomas somáticos del síndrome premenstrual responden favorablemente al aumento de la ingesta de calcio en la dieta o a la suplementación diaria de calcio.
  • El aumento de la ingesta de calcio demostró beneficiar significativamente las cuatro categorías principales de síntomas de SPM (síntomas afectivos negativos, síntomas de retención de agua, antojos de alimentos y síntomas de dolor).
  • En comparación con las mujeres asintomáticas, las mujeres con síndrome premenstrual mostraron fluctuaciones exageradas de las hormonas reguladoras de calcio a lo largo del ciclo menstrual con evidencia de deficiencia de vitamina D e hiperparatiroidismo secundario.

Para el estudio de los autores, un total de 129 mujeres completaron la evaluación bioquímica y hormonal cronometrada con 115 (68 TDPM y 47 controles) que proporcionaron datos hormonales que cumplían los criterios para el análisis. Resultados: aunque no se encontró que el calcio basal en orina de 24 h para la detección sea significativamente diferente entre los grupos, las recolecciones aleatorias de calcio en orina durante el muestreo hormonal fueron significativamente más bajas en el grupo TDPM en comparación con los controles.

En el grupo TDPM, se encontró que el calcio sérico total era significativamente más bajo en 3 puntos: en la fase folicular 1 (menstruación) (9.17 ± 0.55 mg / dl, P <0.001) en comparación con las fases posteriores 2, 3 y 4; en la fase 3 del ciclo medio (9,25 ± 0,55 mg / dl) en comparación con la fase 2 (9,33 ± 0,58 mg / dl, P = 0,036); y durante la fase lútea tardía 5 (9,18 ± 0,73 mg / dl) en comparación con la fase 4 (9,27 ± 0,55 mg / dl, P = 0,018). El calcio ionizado no fluctuó tan dramáticamente como el calcio total, pero se observó una gran diferencia entre las fases tempranas 1 y 2 del ciclo menstrual nuevamente con la fase 1 con la concentración más baja de calcio ionizado (1.166 ± 0.072 vs. 1.175 ± 0.073 mmol / litro , P = 0,069). La PTH intacta alcanzó su punto máximo en la fase folicular 2 (56,9 ± 35,3 pg / ml) después de la disminución del calcio sérico durante las fases 1 y 5. La PTH intacta en la fase folicular fue significativamente mayor que las concentraciones de la fase lútea y alcanzó su punto más bajo en la fase lútea 4 (50,9 ± 34,4 pg / ml, P <0,01). Junto con el aumento de la fase folicular en la PTH intacta, el pH sérico fue menor en la fase folicular 1 y 2 en comparación con la fase 3 del ciclo medio y la fase lútea 4 (fase 1, 7.36 ± 0.004 vs. fase 3, 7.37 ± 0.023; P = 0.015 ; datos no mostrados). La concentración de 1,25 (OH) 2D disminuyó precipitadamente en la fase lútea 4 y fue significativamente menor en comparación con todas las fases anteriores (fase 4, 45.0 ± 27.5 vs. fase 3, 49.6 ± 27.5 pg / ml; P = 0.006). Las concentraciones de calcio en la orina y 25OHD no parecen variar entre las fases individuales en el grupo TDPM.

SSRIs, fungi, and exotic botanicals

This post is about comparing my experiences with fluoxetine (Prozac – an SSRI), psilocybe mushrooms, lion’s mane mushroom, and yerba mate tea. Of course this is my personal experience, not a medical study. Remember that everyone is affected differently by psychoactive compounds. In fact recently my friend told me an interesting scientific theory in regards to why humans differ a lot psychologically. Have you heard of fungi that make ants climb on top of a leaf, hook themselves, and stay there without eating, basically committing ant suicide? The spores of the fungi then burst from the ant and go on to grow into new fungi. Ophiocordyceps unilateralis is called the zombie-ant fungus.

“Researchers think the fungus, found in tropical forests, infects a foraging ant through spores that attach and penetrate the exoskeleton and slowly takes over its behavior.

As the infection advances, the enthralled ant is compelled to leave its nest for a more humid microclimate that’s favorable to the fungus’s growth. The ant is compelled to descend to a vantage point about 10 inches off the ground, sink its jaws into a leaf vein on the north side of a plant, and wait for death.

Meanwhile, the fungus feeds on its victim’s innards until it’s ready for the final stage. Several days after the ant has died, the fungus sends a fruiting body out through the base of the ant’s head, turning its shriveled corpse into a launchpad from which it can jettison its spores and infect new ants.”

So what does this have to do with humans being different? The theory says that humans evolved to react differently to same psychoactive molecules in order to not become victims to simple fungi organisms. Since the infectious fungi are not very complex organisms, they can only release so many molecules. By evolving to have complex brains and having individuals react differently to the same psychoactive molecule, humans became resistant to being overtaken by simple fungi. The theory is that there is no one molecule that a fungi could produce that would make all humans act the same, stop whatever they were doing, walk to a nice moist and wooded area, lie down, and wait for fungi spores to emerge from them.

Back to fluoxetine and shrooms

Fluoxetine

Fluoxetine is a selective serotonin reuptake inhibitor. N-methyl-3-phenyl-3-[4-(trifluoromethyl)phenoxy]propan-1-amine.  It delays the reuptake of serotonin, resulting in serotonin persisting longer when it is released. Also dopamine and norepinephrine may contribute to the antidepressant action of fluoxetine in humans.

From wiki: Fluoxetine elicits antidepressant effect by inhibiting serotonin re-uptake in the synapse by binding to the re-uptake pump on the neuronal membrane to increase its availability and enhance neurotransmission. Norfluoxetine and desmethylfluoxetine are metabolites of fluoxetine and also act as serotonin re-uptake inhibitors, so increase the duration of action of the drug. Fluoxetine appeared on the Belgian market in 1986. In the U.S., the FDA gave its final approval in December 1987, and a month later Eli Lilly began marketing Prozac.

fluoxetine

Fluoxetine is one of medications considered to be effective for PMDD (premenstrual dysphoric disorder). Also research indicates that low doses of fluoxetine could help with PMS. PMS appears to be triggered by the fall in secretion of the ovarian sex steroid hormone progesterone that occurs towards the end of the menstrual cycle and leads to a decline in its breakdown product allopregnanolone, which acts in the brain as a potent sedative and tranquilising agent. In other words, women with PMS are undergoing a type of drug withdrawal response from an in-built, tranquilising steroid chemical in their brains. New research shows that antidepressants such as fluoxetine inhibit a specific enzyme in the brain, which deactivates allopregnanolone, therefore maintaining the chemical balance of this in-built tranquiliser in the brain. Recent findings published in the British Journal of Pharmacology, show that short-term treatment with a low dose of fluoxetine immediately prior to the rat’s premenstrual period not only raised brain allopregnanolone and prevented the development of PMS-like symptoms but also blocked the increase in excitability of brain circuits involved in mediating the stress and fear responses that normally occur during this phase of the cycle.

Enzyme identified that could lead to targeted treatment for PMS

A review of studies found that fluoxetine was more tolerabled by female patients than tricyclic amine antidepressants (Amitriptyline, Imipramine). ” In this study, a retrospective analysis of 11 randomized, double-blind, well-controlled trials was done to compare data from 427 female patients on fluoxetine and 423 female patients on TCAs. Both fluoxetine and TCAs significantly reduced the HAMD17 total mean score from baseline to end point, week 5 (fluoxetine, 24.35 to 14.37; TCAs, 24.57 to 14.43; p < 0.001). Both treatment groups were associated with significant reductions in the HAMD17 anxiety/somatization and insomnia subfactor scores. Abnormal vision, constipation, dizziness, dry mouth, and somnolence occurred more frequently (p < 0.05) in the TCA group. Insomnia and nausea were the only adverse events more common (p < 0.05) in the fluoxetine group. This study demonstrates that fluoxetine is an effective and tolerable agent for the treatment of major depressive disorder in women.”

Fluoxetine vs. tricyclic antidepressants in women with major depressive disorder

My experience with fluoxetine – the first time that I took 10mg of fluoxetine, I felt a difference in less than three hours. It was as if I was taken out of a dark basement and into a sunny day in July. Unfortunately I also experienced insomnia that did not go away and I had a sense of apathy, in the end I stopped taking fluoxetine, but I know many women who swear by it.

Psilocybin

Next I will mention psilocybin. Psilocybin is a psychedelic compound produced by more than 200 species of mushrooms. Psilocybin is quickly converted in human body to psilocin. Psilocin is a prtial agonist for several serotonin receptors. An agonist is a chemical that binds to a receptor and activates the receptor to produce a biological response. Recently there has been increased reseach interest in psilocybin and how it could help with depression.

“A landmark study conducted by the Beckley/Imperial Research Programme has provided the first clinical evidence for the efficacy of psilocybin-assisted psychotherapy to treat depression, even in cases where all other treatments have failed. We gave oral psilocybin to 20 patients with treatment-resistant depression, all of whom had previously tried at least two other treatment methods without success. Participants had suffered from depression for an average of 18 years, with severity ranging from moderate to severe. Each patient received two doses of psilocybin (10 and 25mg) 7 days apart, accompanied by psychological support before, during, and after each session. All participants also underwent brain scans to investigate the neural underpinnings of psilocybin mechanisms of action on depression. Follow-up examinations were carried out at 5 weeks, and three and six months. Results highlights All patients showed some reductions in their depression scores at 1-week post-treatment and maximal effects were seen at 5 weeks, with results remaining positive at 3 and 6 months. Notably, reductions in depressive symptoms at 5 weeks were predicted by the quality of the acute psychedelic experience. The drug was also well tolerated by all participants, and no patients sought conventional antidepressant treatment within 5 weeks of the psilocybin intervention. While it is important to note that this was a relatively small study with no control group, placebo, or ‘blinding’ (meaning participants were fully aware what they were getting), the results are extremely encouraging and confirm that psilocybin is safe to give to depressed patients, warranting further research into this area.”

Sceletium tortuosum (Kanna) – a plant commonly found in South Africa.  Laboratory studies have found that Sceletium alkaloids are selective serotonin reuptake inhibitors (SSRIs). Thus, they have the same action as pharmaceutical SSRIs such as Prozac. Animal studies have found that Sceletium can improve mood and reduce anxiety-related behaviours.