Je travaille sur un problème de prédiction en utilisant un grand ensemble de données textuelles. Je suis en train de mettre en œuvre Modèle de sac de mots.
Quel devrait être le meilleur moyen d'obtenir le sac de mots? À l’heure actuelle, j’ai tf-idf des différents mots et le nombre de mots est trop grand pour pouvoir l’utiliser pour d’autres tâches. Si j'utilise les critères tf-idf, quel devrait être le seuil tf-idf pour obtenir un sac de mots? Ou devrais-je utiliser d'autres algorithmes. J'utilise python.
Utilisation de la classe collections.Counter
>>> import collections, re
>>> texts = ['John likes to watch movies. Mary likes too.',
'John also likes to watch football games.']
>>> bagsofwords = [ collections.Counter(re.findall(r'\w+', txt))
for txt in texts]
>>> bagsofwords[0]
Counter({'likes': 2, 'watch': 1, 'Mary': 1, 'movies': 1, 'John': 1, 'to': 1, 'too': 1})
>>> bagsofwords[1]
Counter({'watch': 1, 'games': 1, 'to': 1, 'likes': 1, 'also': 1, 'John': 1, 'football': 1})
>>> sumbags = sum(bagsofwords, collections.Counter())
>>> sumbags
Counter({'likes': 3, 'watch': 2, 'John': 2, 'to': 2, 'games': 1, 'football': 1, 'Mary': 1, 'movies': 1, 'also': 1, 'too': 1})
>>>
Le sac de mots peut être défini comme une matrice où chaque ligne représente un document et des colonnes représentant le jeton individuel. Une dernière chose, l'ordre séquentiel du texte n'est pas maintenu. Construire un "sac de mots" en 3 étapes
Limites à garder à l'esprit: 1. Impossible de capturer des phrases ou des expressions de plusieurs mots 2. Sensible aux fautes d'orthographe, il est possible de contourner ce problème en utilisant un correcteur orthographique ou une représentation du personnage
par exemple.
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
data_corpus = ["John likes to watch movies. Mary likes movies too.",
"John also likes to watch football games."]
X = vectorizer.fit_transform(data_corpus)
print(X.toarray())
print(vectorizer.get_feature_names())
Le modèle de sac de mots est une méthode de Nice pour la représentation de texte à appliquer à différentes tâches d'apprentissage automatique. Mais dans un premier temps, vous devez supprimer les données inutiles des données, par exemple la ponctuation, les balises HTML, les mots vides, ... Pour ces tâches, vous pouvez facilement exploiter des bibliothèques telles que Beautiful Soup (pour supprimer les balises HTML) ou NLTK (pour supprimer les mots vides) en Python . Après avoir nettoyé vos données, vous devez créer des entités vectorielles (représentation numérique des données pour l’apprentissage automatique), c’est ici que Bag-Of-Words joue le rôle. scikit-learn a un module (module feature_extraction) qui peut vous aider à créer les fonctionnalités de sac de mots.
Vous pouvez trouver tout ce dont vous avez besoin en détail dans ce tutoriel aussi this one peut être très utile. J'ai trouvé les deux très utiles.
Comme d'autres l'ont déjà mentionné, utiliser nltk
serait votre meilleure option si vous voulez quelque chose de stable et évolutif. C'est hautement configurable.
Cependant, il a l'inconvénient d'avoir une courbe d'apprentissage assez abrupte, si vous voulez modifier les valeurs par défaut.
Une fois, j'ai rencontré une situation où je voulais avoir un sac de mots. Le problème était que cela concernait des articles sur les technologies avec des noms exotiques remplis de -
, _
, etc. tels que vue-router
ou _.js
etc.
La configuration par défaut du Word_tokenize
de nltk consiste à scinder le vue-router
en deux mots vue
et router
distincts, par exemple. Je ne parle même pas de _.js
.
Donc, pour ce que ça vaut, j'ai fini par écrire cette petite routine pour que tous les mots soient marqués en un list
, basé sur mes propres critères de ponctuation.
import re
punctuation_pattern = ' |\.$|\. |, |\/|\(|\)|\'|\"|\!|\?|\+'
text = "This article is talking about vue-router. And also _.js."
ltext = text.lower()
wtext = [w for w in re.split(punctuation_pattern, ltext) if w]
print(wtext)
# ['this', 'article', 'is', 'talking', 'about', 'vue-router', 'and', 'also', '_.js']
Cette routine peut être facilement combinée avec la réponse Patty3118 à propos de collections.Counter
, ce qui peut vous permettre de savoir le nombre de fois où _.js
a été mentionné dans l'article, par exemple.
Extrait d'un livre "Machine learning learning python":
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
count = CountVectorizer()
docs = np.array(['blablablatext'])
bag = count.fit_transform(docs)
Vous devriez jeter un oeil sur scikits-learn
, qui contient de nombreuses fonctionnalités. Il y a même du code exemple sur leur site Web.
Une autre option est nltk
, qui dispose de nombreuses fonctionnalités de traitement du langage Nice. Je ne l'ai pas utilisé autant, mais il semble qu'il devrait y avoir des installations pour faire ce que vous faites.