Kadot

Une librairie de traitement du langage naturel

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour !

Cela doit bien faire plusieurs mois que je n’ai pas proposé de solutions overkill au problèmes techniques du site posté ici, cela me manquait ! :p Mais ça m’a entre-autre, aussi permis de développer ce que je vais vous présenter aujourd’hui.

Il se trouve que je m’amuse beaucoup avec les chaînes de Markov, ou encore à m’essayer aux compétitions Kaggle (sans aucune prétention de victoire). Traiter le texte est vraiment intéressant et je pense plus "alchimique" que d’autres formats. C’est donc dans cette optique que j’ai créé Kadot !

L’objectif de cette librairie est d’implémenter simplement tout ce qu’on serait susceptible d’avoir besoin dans un projet en rapport avec le traitement du langage naturel. Mais contrairement à de nombreuses librairies du genre, je ne souhaite pas "hardcoder" les règles de grammaire du langage, Kadot fonctionne donc avec la plupart des langages (j’ai un doute pour les langues telles que le chinois).

Voici quelques exemples tirés du GitHub :

1
2
3
4
5
6
7
8
9
>>> from kadot import Text
>>> example_text = Text("This is an example text !")
>>> example_text.words

['This', 'is', 'an', 'example', 'text']

>>> example_text.ngrams(n=2)

[('This', 'is'), ('is', 'an'), ('an', 'example'), ('example', 'text')]

Ou encore un algorithme de vectorisation des mots, qui "comprend" leurs relations :

1
2
3
4
5
6
7
>>> large_corpus = """Enter a large text, in preference about history."""
>>> history_book = Text(large_corpus)
>>> vectors = history_book.vectorize(window=20, reduce_rate=300)
>>> vectors.apply_vector(vectors['man'], vectors['woman'], vectors['king'], best=1)

# 'man' is to 'woman' what 'king' is to...
[('queen', 0.86899999)]

Je travaille aussi sur d’autres fonctionnalités comme la classification de texte ou l’extraction de mots clés.

Je m’excuse de cette présentation un peu décousue, je vous laisse juste quelque liens si ça vous intéresse.

Il est possible qu’il y est des erreurs d’anglais, n’hésitez pas à me les signaler. :)

Édité par the_new_sky

"C’est nuageux par ici"

+5 -0

Ta Killer feature c’est un word2vec non ? Édit: vu les sources c’est "simplement" une analyse statistique de concurrence. Je suis déçu ;)

Sinon qu’est ce qui te distingue d’une lib comme gensim par exemple ?

Édité par Kje

+1 -0
Auteur du sujet

Disons qu’il y a deux manières de "vectorizer" les mots : les modèles prédictif comme word2vec (j’ai d’ailleurs commencé à implémenter un modèle du genre, mais c’est trop moche pour être pushé), et les modèles où l’on compte "à la main", et l’on réduit la dimension des vecteurs si c’est vraiment trop long. Les deux modèles ont des résultats assez proche, le seul problème sur le modèle que j’utilise c’est le nombre de dimensions sur de long texte, ça réduit les performances.

Je ne prétends pas remplacer Gensim, c’est un outil assez complet et pro. Avec Kadot, j’essaye de faire une API du même genre que TextBlob, quelques choses de plus simple d’usage, pour le prototypage par exemple.

J’ai aussi quelques fonctionnalités que Gensim n’a pas (à ma connaissance) comme un générateur de texte.

Édité par the_new_sky

"C’est nuageux par ici"

+0 -0

Cette réponse a aidé l'auteur du sujet

Je viens de regarder les sources. Je vois que tu as numpy/scipy/sklearn en dépendance mais seul numpy semble importé.

Et je suis tomber sur ta classe VectorCoordinate. Tu as numpy en dépendance, c’est une très bonne idée, mais dans ce cas utilise le. Ne redéfinit pas une classe vecteur ! La classe array de numpy est là pour ça et sera mille fois plus efficace (et je n’exagère pas).

Si c’est pour ajouter des méthodes (comme ta méthode compare):

  • Elle est dispo dans scipy
  • Si tu as besoin de rajouter des méthodes, tu peux hériter de ndarray même si c’est pas aussi simple qu’une classe classique. Cependant un "view-casting" est probablement suffisant et très simple.
  • Au pire, utilise un array numpy en interne et les methodes de numpy pour faire les opérations. N’utilise pas une liste pour self.coordinates.

Il n’y a qu’une raison qui fait que numpy n’est pas intégré dans la lib standard : Guido ne veut pas les gêner à être bloqué avec le cycle de release de python. C’est largement la lib la plus utilisé de python. Hésite pas à l’utiliser. Abuse-en, vraiment. En Python une classe Vecteur propre à un projet n’a aucun sens. Tous tes utilisateurs s’attendent à ce que tu utilise numpy pour représenter les vecteurs.

Par exemple, les premières versions du binding open-cv exposait leur propre vecteur/matrice comme une classe indépendante. C’est tellement chiant que les nouvelles versions utilisent numpy coté python. Et il y en a d’autres comme ça (tensorflow par ex).

Édité par Kje

+2 -0
Auteur du sujet

En effet !

La classe VectorCoordinate avait été intégrée un peu vite et je me suis rapidement rendu compte que ce n’était pas pratique puisque que dans pas mal d’opérations (notamment avec scikit-learn) je finissais par le convertir en array. :D

Pour la méthode compare, j’utilise scipy donc on peut facilement se passer de cette méthode, même si c’est un peu dommage. Je vais réfléchir aux solutions que tu m’as proposé, en évitant de rendre le code trop complexe.

En tout cas je te remercie ;)

"C’est nuageux par ici"

+0 -0

Pour la méthode compare, j’utilise scipy donc on peut facilement se passer de cette méthode, même si c’est un peu dommage

Très sincèrement, tout ce qui peut t’éviter de maintenir du code est bon à prendre. L’objectif de ta lib n’est pas de faire du calcul bas niveau, c’est faire du nlp. Tout ce que tu peux éviter de maintenir est une bonne chose.

En plus, j’insiste sur ce point, numpy & co sont des référence pour ça en python. Un dev qui utilisera ta lib va vraiment s’attendre à trouver numpy quand tu lui présentera un vecteur.

Ça peut sembler un peu plus complexe ou verbeux au début, plutot qu’une classe conçu de façon dédié, mais tu gagnera au long terme et ça te permettra de te concentrer sur ce qui a de l’importance, les algos, et pas les détails bas niveaux.

+2 -0
Auteur du sujet

Comme @Kje me l’a suggéré, j’ai mis à jour le projet en favorisant l’usage des numpy arrays à la place de ma classe maison. Je pense que c’est loin d’être propre mais c’est un bon début (j’entend par là que mon usage de numpy n’est peut-être pas optimal). J’ai pushé la mise à jour sur Pypi. :)

Édité par the_new_sky

"C’est nuageux par ici"

+0 -0
Auteur du sujet

Bonjour ! Je déterre ce topic car cela fait exactement huit mois que je n’ai pas donné de nouvelles du projet ici !

Tout d’abord, je m’amuse toujours autant avec ce projet. Aujourd’hui, Kadot inclus un tokenizer, des vectorizer, une chaîne de markov, une API pour classifier du texte avec Scikit-Learn et même un simple correcteur d’orthographe. Le projet est toujours disponible sur Github, il a même dépassé les 80 stars et est apparu dans les tendances du langage Python le temps d’une petite journée. :D

Mais alors, what’s next ? J’attaque pour ces vacances une ré-écriture complète : Déjà, le code mérite une petite refonte, une simplification et surtout, je prévois d’ajouter de nombreuses fonctionnalités liés aux chatbots.

Édité par the_new_sky

"C’est nuageux par ici"

+3 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte