François HU - ENSAE - 14/04/20 - https://curiousml.github.io/
from jyquickhelper import add_notebook_menu
add_notebook_menu()
Organisation des parties :
$\color{grey}{\text{*cacher le code}}$
from IPython.display import HTML, Image
HTML('''<script>code_show=true; function code_toggle() {if (code_show){$('div.input').hide();} else {$('div.input').show();}code_show = !code_show} $( document ).ready(code_toggle);</script><form action="javascript:code_toggle()"><input type="submit" value="cacher / afficher code"></form>''')
Régression logistique
Image("img/logreg.png", width=700, height = 200)
Quelques fonctions d'activation
Image("img/factivations.png", width=800, height = 200)
Réseau de neurones
Image("img/RNA.png", width=750, height = 200)
Deep Learning (apprentissage profond)
Image("img/DL.png", width=850, height = 200)
$\color{grey}{\text{*afficher le code}}$
from IPython.display import HTML, Image
HTML('''<script>code_show=true; function code_toggle() {if (code_show){$('div.input').hide();} else {$('div.input').show();}code_show = !code_show} $( document ).ready(code_toggle);</script><form action="javascript:code_toggle()"><input type="submit" value="cacher / afficher code"></form>''')
"Devons-nous, mon collègue et moi, vous recontacter?"["Devons", "nous", "mon", "collègue", "et", "moi", "vous", "recontacter"]from nltk.tokenize import WhitespaceTokenizer, WordPunctTokenizer, word_tokenize
text = "J'ai une question : devons-nous, mon collègue et moi, vous recontacter?"
Implémentations avec python
tokenizer = WhitespaceTokenizer()
print(tokenizer.tokenize(text))
["J'ai", 'une', 'question', ':', 'devons-nous,', 'mon', 'collègue', 'et', 'moi,', 'vous', 'recontacter?']
tokenizer = WordPunctTokenizer()
print(tokenizer.tokenize(text))
['J', "'", 'ai', 'une', 'question', ':', 'devons', '-', 'nous', ',', 'mon', 'collègue', 'et', 'moi', ',', 'vous', 'recontacter', '?']
print(word_tokenize(text, language='french'))
["J'ai", 'une', 'question', ':', 'devons-nous', ',', 'mon', 'collègue', 'et', 'moi', ',', 'vous', 'recontacter', '?']
continu$\color{red}{\text{a}}$, continu$\color{red}{\text{ait}}$, continu$\color{red}{\text{ant}}$, continu$\color{red}{\text{ation}}$, continu$\color{red}{\text{ation}}$, continu$\color{red}{\text{e}}$ $\to$ continu
continua, continuait, continuant $\to \color{red}{\text{continuer}}$
continuations, continuation $\to \color{red}{\text{continuation}}$
continue $\to \color{red}{\text{continu / continuer}}$ (adjectif / verbe)
Implémentations avec python
from nltk.stem import SnowballStemmer
fr = SnowballStemmer('french')
" ".join(fr.stem(token) for token in word_tokenize(text))
"j ' ai une question : devon - nous , mon collègu et moi , vous recontact ?"
import spacy
nlp = spacy.load('fr_core_news_md')
" ".join(token.lemma_ for token in nlp(text))
'je avoir un question : devoir - nous , mon collègue et moi , vous recontacter ?'
Les expressions régulières en Python nécessitent d'importer le module natif re : https://fr.wikibooks.org/wiki/Programmation_Python/Regex
import re
text_b = ("<b>" + text + "</b>").lower()
print(text_b)
<b>j'ai une question : devons-nous, mon collègue et moi, vous recontacter?</b>
<...> ... </...>text_b = re.sub("<.*?>", " ", text_b) # balises <...>
print(text_b)
j'ai une question : devons-nous, mon collègue et moi, vous recontacter?
-, !, ?, :, ...import string
text_b = re.sub(r"[" + string.punctuation + r"]", " ", text_b) # ponctuations
text_b = re.sub(r"\s+", " ", text_b) # grands espaces
print(text_b)
j ai une question devons nous mon collègue et moi vous recontacter
a, à, des, de, et, est, un, ...implémentations avec python : supprimer les stopwords
from nltk.corpus import stopwords
# Chargement des stopwords pour la langue francaise avec NLTK
stopwords_lst = list(stopwords.words("french"))
re.sub(r"(\s+|^)(" + r"|".join(stopwords_lst) + r")(\s+|$)", " ", text)
"J'ai question : devons-nous, collègue moi, recontacter?"
Résumé :
tokeniser
raciniser et lemmatiser
stop-words
$\color{grey}{\text{*cacher le code}}$
from IPython.display import HTML, Image
HTML('''<script>code_show=true; function code_toggle() {
if (code_show){$('div.input').hide();}
else {$('div.input').show();}code_show = !code_show} $( document ).ready(code_toggle);
</script><form action="javascript:code_toggle()">
<input type="submit" value="cacher / afficher code"></form>''')
Image("img/MLtab.png", width=600, height = 200)
Image("img/MLtext.png", width=600, height = 200)
Image("img/tab.png", width=700, height = 200)
Image("img/BOW1.png", width=800, height = 200)
Image("img/BOW2.png", width=800, height = 200)
Image("img/BOW3.png", width=800, height = 200)
1. approche bag-of-words
Image("img/BOW_example.png", width=1000, height = 200)
2. approche n-grammes (n-grams en anglais)
Image("img/ngrams_example.png", width=1000, height = 200)
3. approche TF-IDF
Image("img/TFIDF_example.png", width=1000, height = 200)
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(min_df=2, max_df=0.5, ngram_range=(1,2))
features = tfidf.fit_transform(texts)
Résumé :
méthode 1 : vectorisation par comptage + bag-of-words
méthode 2 : vectorisation par comptage + n-grammes
méthode 3 : vectorisation par TF-IDF