File size: 7,698 Bytes
f1208cb
 
 
 
 
cd54b8a
 
7795ef8
 
dc27bce
c4555f3
7795ef8
deda896
7795ef8
deda896
7795ef8
f1208cb
 
290c1b4
5cf5d93
05bdc29
5cf5d93
a939abb
a81966d
a939abb
 
 
8aca81d
 
 
5cf5d93
 
58626c4
5cf5d93
58626c4
 
5cf5d93
 
c7e8500
 
5cf5d93
 
 
 
 
3727742
5cf5d93
 
46e8059
5cf5d93
 
 
 
 
46e8059
3840aac
5cf5d93
 
 
8aca81d
 
47cbc92
 
 
 
 
58626c4
47cbc92
 
 
58626c4
 
47cbc92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5441fe4
47cbc92
 
 
 
 
 
 
 
 
 
 
5441fe4
47cbc92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5441fe4
32cd6fe
 
47cbc92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8aca81d
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
---
language: 
  - it
tags:
- summarization
- tags
- Italian
inference:
  parameters:
    do_sample: False
    min_length: 0
widget:
  - text: "Nel 1924 la scrittrice Virginia Woolf affrontò nel saggio Mr Bennett e Mrs Brown il tema della costruzione e della struttura del romanzo, genere all’epoca considerato in declino a causa dell’incapacità degli autori e delle autrici di creare personaggi realistici. Woolf raccontò di aver a lungo osservato, durante un viaggio in treno da Richmond a Waterloo, una signora di oltre 60 anni seduta davanti a lei, chiamata signora Brown. Ne rimase affascinata, per la capacità di quella figura di evocare storie possibili e fare da spunto per un romanzo: «tutti i romanzi cominciano con una vecchia signora seduta in un angolo». Immagini come quella della signora Brown, secondo Woolf, «costringono qualcuno a cominciare, quasi automaticamente, a scrivere un romanzo». Nel saggio Woolf provò ad analizzare le tecniche narrative utilizzate da tre noti scrittori inglesi dell’epoca – H. G. Wells, John Galsworthy e Arnold Bennett – per comprendere perché le convenzioni stilistiche dell’Ottocento risultassero ormai inadatte alla descrizione dei «caratteri» umani degli anni Venti. In un lungo e commentato articolo del New Yorker, la critica letteraria e giornalista Parul Sehgal, a lungo caporedattrice dell’inserto culturale del New York Times dedicato alle recensioni di libri, ha provato a compiere un esercizio simile a quello di Woolf, chiedendosi come gli autori e le autrici di oggi tratterebbero la signora Brown. E ha immaginato che probabilmente quella figura non eserciterebbe su di loro una curiosità e un fascino legati alla sua incompletezza e al suo aspetto misterioso, ma con ogni probabilità trasmetterebbe loro l’indistinta e generica impressione di aver subìto un trauma."
    example_title: "Virginia Woolf"
  - text: "I lavori di ristrutturazione dell’interno della cattedrale di Notre-Dame a Parigi, seguiti al grande incendio che nel 2019 bruciò la guglia e buona parte del tetto, sono da settimane al centro di un acceso dibattito sui giornali francesi per via di alcune proposte di rinnovamento degli interni che hanno suscitato critiche e allarmi tra esperti e opinionisti conservatori. Il progetto ha ricevuto una prima approvazione dalla commissione nazionale competente, ma dovrà ancora essere soggetto a varie revisioni e ratifiche che coinvolgeranno tecnici e politici locali e nazionali, fino al presidente Emmanuel Macron. Ma le modifiche previste al sistema di viabilità per i visitatori, all’illuminazione, ai posti a sedere e alle opere d’arte che si vorrebbero esporre hanno portato alcuni critici a parlare di «parco a tema woke» e «Disneyland del politicamente corretto»."
    example_title: "Notre-Dame"
---

# text2tags

The model has been trained on a collection of 28k news articles with tags. Its purpose is to create tags suitable for the given article. We can use this model also for information-retrieval purposes (GenQ), fine-tuning sentence-transformers for asymmetric semantic search. 

<p align="center">
    <img src="https://upload.wikimedia.org/wikipedia/commons/1/1a/Pieter_Bruegel_d._%C3%84._066.jpg" width="600"> </br>
    Pieter Bruegel the Elder, The Fight Between Carnival and Lent, 1559
</p>

### Usage 

Sample code with an article from IlPost:

```python
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

model = AutoModelForSeq2SeqLM.from_pretrained("efederici/text2tags")
tokenizer = AutoTokenizer.from_pretrained("efederici/text2tags")

article = '''
Da bambino era preoccupato che al mondo non ci fosse più nulla da scoprire. Ma i suoi stessi studi gli avrebbero dato torto: insieme a James Watson, nel 1953 Francis Crick strutturò il primo modello di DNA, la lunga sequenza di codici che identifica ogni essere vivente, rendendolo unico e diverso da tutti gli altri. 
La scoperta gli valse il Nobel per la Medicina. È uscita in queste settimane per Codice la sua biografia, Francis Crick — Lo scopritore del DNA, scritta da Matt Ridley, che racconta vita e scienza dell'uomo che capì perché siamo fatti così.
'''

def tag(text: str):
    """ Generates tags from given text """
    text = text.strip().replace('\n', '')
    text = 'summarize: ' + text
    tokenized_text = tokenizer.encode(text, return_tensors="pt")

    tags_ids = model.generate(tokenized_text,
                                        num_beams=4,
                                        no_repeat_ngram_size=2,
                                        max_length=20,
                                        early_stopping=True)

    output = tokenizer.decode(tags_ids[0], skip_special_tokens=True)
    return output.split(', ')

tags = tag(article)
print(tags)
```

## Longer documents

Assuming paragraphs are divided by: '\n\n'.

```python
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
import itertools
import re 

model = AutoModelForSeq2SeqLM.from_pretrained("efederici/text2tags")
tokenizer = AutoTokenizer.from_pretrained("efederici/text2tags")

article = '''
Da bambino era preoccupato che al mondo non ci fosse più nulla da scoprire. Ma i suoi stessi studi gli avrebbero dato torto: insieme a James Watson, nel 1953 Francis Crick strutturò il primo modello di DNA, la lunga sequenza di codici che identifica ogni essere vivente, rendendolo unico e diverso da tutti gli altri. 
La scoperta gli valse il Nobel per la Medicina. È uscita in queste settimane per Codice la sua biografia, Francis Crick — Lo scopritore del DNA, scritta da Matt Ridley, che racconta vita e scienza dell'uomo che capì perché siamo fatti così.
'''

def words(text):
    input_str = text
    output_str = re.sub('[^A-Za-z0-9]+', ' ', input_str)
    return output_str.split()

def is_subset(text1, text2):
    return all(tag in words(text1.lower()) for tag in text2.split())

def cleaning(text, tags):
    return [tag for tag in tags if is_subset(text, tag)]
    
def get_texts(text, max_len):
    texts = list(filter(lambda x : x != '', text.split('\n\n')))
    lengths = [len(tokenizer.encode(paragraph)) for paragraph in texts]
    output = []
    for i, par in enumerate(texts):
        index = len(output)
        if index > 0 and lengths[i] + len(tokenizer.encode(output[index-1])) <= max_len:
            output[index-1] = "".join(output[index-1] + par)
        else:
            output.append(par)
    return output
        
def get_tags(text, generate_kwargs):
    input_text = 'summarize: ' + text.strip().replace('\n', ' ')
    tokenized_text = tokenizer.encode(input_text, return_tensors="pt")
    with torch.no_grad():
        tags_ids = model.generate(tokenized_text, **generate_kwargs)
    
    output = []
    for tags in tags_ids:
        cleaned = cleaning(
            text, 
            list(set(tokenizer.decode(tags, skip_special_tokens=True).split(', ')))
        )
        output.append(cleaned)
    
    return list(set(itertools.chain(*output))) 
        
def tag(text, max_len, generate_kwargs):
    texts = get_texts(text, max_len)
    all_tags = [get_tags(text, generate_kwargs) for text in texts]
    flatten_tags = itertools.chain(*all_tags)
    return list(set(flatten_tags))

params = {
    "min_length": 0,
    "max_length": 30,
    "no_repeat_ngram_size": 2,
    "num_beams": 4,
    "early_stopping": True,
    "num_return_sequences": 4,
}
tags = tag(article, 512, params)
print(tags)
```

### Overview

- Model: T5 ([it5-small](https://huggingface.co/gsarti/it5-small))
- Language: Italian
- Downstream-task: Summarization (for topic tagging)
- Training data: Custom dataset
- Code: See example
- Infrastructure: 1x T4