-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpyTopics.py
More file actions
180 lines (129 loc) · 5.84 KB
/
pyTopics.py
File metadata and controls
180 lines (129 loc) · 5.84 KB
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
import os
import pandas as pd
import pyLDAvis
import pyLDAvis.gensim_models as gensimvis
from gensim.corpora import Dictionary, MmCorpus
from gensim.models import LdaModel
from gensim.utils import tokenize as gensim_tokenize
def remove_rows_containing_strings(df, column_num, strings_to_remove):
"""
Fonction pour enlever les lignes contenant des chaînes de caractères spécifiques dans une colonne donnée du DataFrame.
"""
condition = df.iloc[:, column_num].str.contains('|'.join(strings_to_remove), na=False)
return df[~condition]
def tokenize_corpus(corpus, language='english'):
"""
Fonction pour tokeniser un corpus de texte en utilisant Gensim.
"""
tokenized_corpus = []
for sentence in corpus:
tokens = list(gensim_tokenize(sentence))
tokenized_corpus.append(tokens)
return tokenized_corpus
def create_segments(df, segment_length, join_char):
"""
Fonction pour créer des segments de tailles identiques à partir des données du DataFrame.
Retourne un DataFrame contenant deux colonnes : "document" et "segment".
"""
segments = []
num_rows = len(df)
for i in range(0, num_rows, segment_length):
segment_df = df.iloc[i:i+segment_length]
segment_text = join_char.join(segment_df.iloc[:, 1].tolist())
segments.append(segment_text)
# Tokenisation des segments
tokenized_segments = tokenize_corpus(segments)
# Création du DataFrame de sortie
segments_df = pd.DataFrame({"document": [f"segment_{i+1}" for i in range(len(segments))], "segment": tokenized_segments})
return segments_df
def train_lda_model(tokenized_segments, num_topics=5):
"""
Fonction pour entraîner un modèle de sujets LDA sur les segments tokenisés.
Retourne le modèle entraîné.
"""
# Création du dictionnaire à partir des segments tokenisés
dictionary = Dictionary(tokenized_segments)
# Création du corpus
corpus = [dictionary.doc2bow(segment) for segment in tokenized_segments]
# Supprimer les hapax du corpus
filtered_corpus = remove_hapax(corpus)
# Entraînement du modèle LDA
lda_model = LdaModel(filtered_corpus, num_topics=num_topics, id2word=dictionary)
return lda_model
def remove_stopwords(text, stopwords):
"""
Fonction pour supprimer les stopwords d'un texte donné.
"""
filtered_text = [word for word in text if word not in stopwords]
return filtered_text
def load_stopwords(file_path):
"""
Fonction pour charger une liste de stopwords à partir d'un fichier.
"""
with open(file_path, 'r', encoding='utf-8') as file:
stopwords = [line.strip() for line in file]
return set(stopwords)
def visualize_lda_model(lda_model, corpus, dictionary, output_path):
"""
Fonction pour visualiser un modèle LDA avec PyLDAvis et enregistrer la visualisation dans un fichier HTML.
"""
vis_data = gensimvis.prepare(lda_model, corpus, dictionary)
pyLDAvis.save_html(vis_data, output_path)
def remove_hapax(corpus):
"""
Fonction pour supprimer les hapax du corpus.
"""
# Compter la fréquence de chaque mot dans le corpus
word_frequency = {}
for document in corpus:
for word_id, frequency in document:
if word_id in word_frequency:
word_frequency[word_id] += frequency
else:
word_frequency[word_id] = frequency
# Identifier les hapax
hapax_ids = [word_id for word_id, frequency in word_frequency.items() if frequency == 1]
# Supprimer les hapax du corpus
filtered_corpus = [[(word_id, frequency) for word_id, frequency in document if word_id not in hapax_ids] for document in corpus]
return filtered_corpus
def save_corpus_and_dictionary(corpus, dictionary, corpus_file_path, dictionary_file_path):
"""
Fonction pour enregistrer le corpus et le dictionnaire Gensim dans des fichiers distincts.
"""
# Enregistrement du corpus
MmCorpus.serialize(corpus_file_path, corpus)
# Enregistrement du dictionnaire
dictionary.save(dictionary_file_path)
def main():
# Chemin vers le fichier CSV
path = ""
csv_file_path = path + "indexTotalTabulaire.csv"
# Lecture du fichier CSV en utilisant pandas avec la tabulation comme délimiteur
df = pd.read_csv(csv_file_path, sep='\t')
# Liste des termes à supprimer
terms_remove = ["latex"]
# Liste des termes à supprimer
terms_2_remove = ["tabular", "{|}", "&"]
# Suppression des lignes contenant les termes spécifiés dans la deuxième colonne (index 1)
df = remove_rows_containing_strings(df, 2, terms_remove)
df = remove_rows_containing_strings(df, 1, terms_2_remove)
# Paramètres pour la création des segments
segment_length = 40 # Longueur de chaque segment
join_char = ' ' # Caractère de jointure entre les éléments de chaque segment
# Création des segments
segments_df = create_segments(df, segment_length, join_char)
# Chargement des stopwords depuis un fichier
stopwords = load_stopwords(path + "stopwords.txt")
# Suppression des stopwords des segments tokenisés
segments_df['segment'] = segments_df['segment'].apply(lambda x: remove_stopwords(x, stopwords))
# Entraînement du modèle LDA sur les segments tokenisés
tokenized_segments = segments_df['segment']
dictionary = Dictionary(tokenized_segments)
corpus = [dictionary.doc2bow(segment) for segment in tokenized_segments]
lda_model = train_lda_model(tokenized_segments,)
# On sauvegarde le corpus au format dédié par gensim
save_corpus_and_dictionary(corpus, dictionary, path + "corpus.mm", path + "dictionary.dict")
# Visualisation du modèle LDA et enregistrement de la visualisation dans un fichier HTML
visualize_lda_model(lda_model, corpus, dictionary, "lda_visualization.html")
if __name__ == "__main__":
main()