Le modèle de sujet de cas de thèse de fin d'études LDA réalise le regroupement de texte

introduction

Ceci est un blog basé sur ma thèse de fin d'études. J'ai choisi ce sujet parce que je suis très intéressé par l'analyse des données. Lors de la rédaction de la thèse, j'ai fait référence à un grand nombre de blogs CSDN liés.

Le temps passe vite, à l'occasion de l'obtention du diplôme, j'aimerais partager mon expérience et mon expérience dans le processus de thèse, en tant que référence pour les frères et sœurs.

(Le contenu suivant a été vérifié par HowNet, veuillez ne pas republier)

Connaissance préliminaire du modèle de sujet LDA

L'essence du modèle de sujet LDA est un algorithme de regroupement de texte, qui appartient au modèle de génération de document (utilisant la similarité des échantillons). Il est souvent utilisé dans l'exploration de sujets de données textuelles, telles que l'exploration de commentaires d'utilisateurs, l'exploration d'informations sur la demande de recrutement de talents, etc. C'est un algorithme couramment utilisé en PNL.

(1) Distribution multinomiale Distribution multinomiale

La distribution multinomiale est une généralisation de la distribution binomiale. La distribution binomiale la plus courante, telle qu'une expérience de tirage au sort, n'a que deux résultats expérimentaux, à savoir pile et face, et chaque résultat a une probabilité de 1/2. Supposons maintenant l'expérience de lancer de dés, les 6 faces correspondent à 6 points différents, et la probabilité que chaque point apparaisse est de 1/6, ce qui est une distribution multinomiale typique. Mais c'est une situation idéale. Maintenant qu'on l'étend à n situations, et que la probabilité de chaque surface est incertaine, on peut penser que la probabilité de chaque résultat obéit à une certaine distribution. La fonction de densité de probabilité est la suivante : P { X
1 = n 1 , X 2 = n 2 , … , X r = nr } = n ! n 1 ! n 2 ! … nr ! P 1 n 1 P 2 n 2 … P rnr P \lbrace X_1=n_1,X_2 =n_2 , \ldots ,X_r=n_r \rbrace ={n! \over n_1!n_2! \ldots n_r!} P{ ^{n_1}_1 }P{ ^{n_2}_2 } \ldots P{ ^{n_r} _r}P { X1=n1,X2=n2,,Xr=nr}=n1! n2!nr!n !P1n1P2n2Prnr
其中,n 1 + n 2 + … + nr = n n_1+n_2+ \ldots+n_r=nn1+n2++nr=n
P 1 + P 2 + … + P r = 1 P_1+P_2+ \ldots+P_r=1P1+P2++Pr=1
Cet article suppose que la distribution des sujets et la distribution des mots obéissent à une distribution multinomiale. En effet : un article a un certain nombre de sujets, et un certain sujet peut être sélectionné avec une certaine probabilité. En d'autres termes, dans tout le nombre de sujets (inclus et non inclus dans l'article), la plupart des probabilités de sujets correspondant à l'article sont 0, et seul un nombre limité de sujets ont une probabilité non nulle. sujet correspondant à chaque article La probabilité est considérée comme une ligne, et tous les articles sont disposés et combinés pour obtenir une énorme matrice creuse, qui est similaire à la distribution des polynômes. Par conséquent, nous utilisons une distribution multinomiale pour ajuster la distribution des sujets et la distribution des mots.

(2) Distribution de Dirichlet Distribution de Dirichlet

La distribution de Dirichlet est une extension de la distribution Beta au cas multivarié, et sa fonction de densité de probabilité est la suivante :
insérez la description de l'image ici

Parmi eux, le vecteur α est le paramètre de la distribution de Dirichlet ; B(α) représente la constante de normalisation de la distribution de Dirichlet.

(3) Distribution conjuguée Distribution conjuguée

Un concept courant dans les statistiques bayésiennes distribuées conjuguées, lorsque la fonction de densité de probabilité de la distribution postérieure a la même forme que la fonction de densité de probabilité de la distribution antérieure, nous les appelons un ensemble de distributions conjuguées. Par exemple, la distribution bêta et la distribution binomiale sont un ensemble de distributions conjuguées, et la distribution de Dirichlet et la distribution multinomiale utilisées dans cet article sont un ensemble de distributions a priori conjuguées.

(4) Échantillonnage de Gibbs

L'échantillonnage de Gibbs est un algorithme simple et largement applicable de la chaîne de Markov Monte Carlo (MCMC), qui peut être considéré comme un cas particulier de l'algorithme de Metropolis-Hastings. L'échantillonnage de Gibbs convient aux cas où la distribution conjointe n'est pas explicitement connue ou difficile à échantillonner directement, mais la distribution conditionnelle de chaque variable est connue et il est facile (ou du moins plus facile) de l'échantillonner. Plus précisément, il fixe alternativement une certaine dimension, puis échantillonne la valeur de cette dimension par la valeur d'autres dimensions. Le modèle de sujet LDA dans cet article est un modèle de génération de document, qui est généré par échantillonnage Gipps.

Processus de code du modèle de sujet LDA

Les échantillons utilisés sont des revues de presse liées au sujet de recherche. Par conséquent, le traitement suivant est effectué pour le texte chinois. Le texte des données brutes est le suivant :
insérez la description de l'image ici

(1) Prétraitement du texte

Cette partie est plus conventionnelle, comprenant la segmentation des mots balbutiants et l'ajout de mots vides.

#这里定义停用词列表
def stopwordslist(filepath):
    stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
    return stopwords

# 对句子进行分词
def seg_sentence(sentence):
    sentence = re.sub(u'[0-9\.]+', u'', sentence)
    
    jb.add_word('今年')		# 这里是加入用户自定义的词来补充jieba词典。
    jb.add_word('成为')	    # 想要删除的词语就先把它加上然后放进停用词表
    jb.add_word('通过')
    jb.add_word('我们')
    jb.add_word('自己')
    jb.add_word('以来')
    jb.add_word('没有')
    jb.add_word('天津')
    jb.add_word('电商')
    jb.add_word('西安')
    
    sentence_seged = jb.cut(sentence.strip())
    stopwords = pd.read_csv("./stopwords.txt",index_col=False,quoting=3,sep=" ",names=['stopword'],encoding='UTF-8')
    stopwords = stopwordslist('./stopwords.txt')  # 这里加载停用词的路径
    outstr = ''
    for word in sentence_seged:
        if word not in stopwords and word.__len__()>1:
            if word != '\t':
                outstr += word
                outstr += " "
    return outstr

#这里要注意编码问题 inputs即是读入原文本,outputs即是新建一个文本,然后将处理好的文本放入
inputs = open('./text.txt','r',encoding='gb18030')


outputs = open('./text03.txt','w',encoding='gb18030')
for line in inputs:
    line_seg = seg_sentence(line)  # 这里的返回值是字符串
    outputs.write(line_seg + '\n')
outputs.close()
inputs.close()

Par conséquent, le texte après le prétraitement est stocké dans le texte des sorties, et l'opération suivante peut être directement importée dans les sorties. Le texte prétraité est le suivant :
insérez la description de l'image ici

(2) Modélisation et visualisation

Il existe de nombreux codes pour construire le modèle de sujet LDA, voici ceux utilisés dans cet article :

#这里先导入常用库
from gensim import corpora
from gensim.models import LdaModel
from gensim.corpora import Dictionary
import codecs

train = []

fp=codecs.open(r'F:\Desktop\comments_chuli\text03.txt','r',encoding='gb18030')

data=fp.read()
fp.close()

'''
for line in data: 
    if line != '':
        line = line.split(" ")
        train.append([w for w in line])
'''
#以下几行将train列表的每个元素都生成一个列表 形成列表嵌套
train0=data.split(" ")
train=[]
for i in range(len(train0)):
    train1=[]
    train1.append(train0[i])
    train.append(train1)


dictionary = corpora.Dictionary(train)
dictionary.filter_extremes(no_below=2, no_above=0.1)

corpus = [dictionary.doc2bow(text) for text in train]

lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=10, passes=50)
#corpus是词袋,dictionary是词典
# num_topics:主题数目
# passes:训练伦次
# num_words:每个主题下输出的term的数目
#corpus指语料词典

#以下为模型的输出结果,即是每个主题下的20个特征词
#可以适当注释,节省运行时间

for topic in lda.print_topics(num_words = 20):
    termNumber = topic[0]
    print(topic[0], ':', sep='')
    listOfTerms = topic[1].split('+')
    for term in listOfTerms:
        listItems = term.split('*')
        print('  ', listItems[1], '(', listItems[0], ')', sep='')
  
    
#--------------以下是代码可视化部分------------------------------

#将可视化结果保存到lda001的网页上
import gensim
from gensim import models
import pyLDAvis.gensim_models
pyLDAvis.enable_notebook()
def lda_vis():
    #dictionary = gensim.corpora.Dictionary.load('lda.dict')
    #corpus = gensim.corpora.MmCorpus('lda.mm')
    #lda = models.ldamodel.LdaModel.load('lda.lda')
    vis = pyLDAvis.gensim_models.prepare(lda, corpus, dictionary)
    pyLDAvis.save_html(vis, r'F:\Desktop\comments_chuli\lda001.html')
    return 0
 
 
if __name__ == '__main__':
    lda_vis()

Selon les résultats de l'opération du modèle, c'est-à-dire les 20 mots sous chaque thème, on peut en déduire à quel type de thème il appartient, de manière à réaliser le topic mining. Ici, lorsque j'intercepte le nombre de sujets à 5, les résultats de l'opération de modèle sont les suivants. La figure ci-dessous montre les mots caractéristiques sous chaque sujet, et le poids de chaque mot caractéristique est entre parenthèses : ce qui doit être noté ici est
insérez la description de l'image ici
:

(1) Étant donné que le modèle LDA est un modèle de génération de documents, il doit échantillonner et générer en continu des sujets et des mots, et le répéter plusieurs fois. Le processus de modélisation est plus compliqué et le temps de calcul est plus long. Par conséquent, ajoutez des commentaires à certains codes en fonction de la situation pour réduire son temps d'exécution ;

(2) Une attention particulière doit être accordée au fait que le traitement des types de données avec le modèle de sac de mots doit être une imbrication de listes . De même, le train ci-dessus est une imbrication de listes. (Il y a une grande fosse ici, j'y ai passé beaucoup de temps)

(3) Optimisation du modèle

Le modèle de sujet LDA est essentiellement un modèle de clustering de texte, et comme l'algorithme de clustering K-means, il nous oblige à saisir manuellement le nombre de clusters.

Lorsque le nombre de clusters est trop grand, un surajustement peut se produire ;

Cependant, si le nombre de groupes est trop petit, différents sujets peuvent être regroupés et l'effet de regroupement n'est pas évident ;

Par conséquent, il est crucial pour les algorithmes de clustering de déterminer le nombre approprié de sujets.

Dans le modèle de rubrique LDA, il existe cinq options pour le nombre de rubriques :

A, perplexité

Proposé par Ble, le contenu principal est de construire une fonction de vraisemblance pour le modèle formé et de trouver sa valeur maximale. Plus la valeur est grande, meilleure est la qualité du sujet extrait, et la plus petite confusion à ce moment. On peut comprendre que le modèle formé est pour a Quels sujets du document C sont incertains, donc la taille de la perplexité est inversement proportionnelle à la qualité du modèle .

B. Cohérence (cohérence)

Proposé par LauJH (2010), il s'agit d'une évaluation quantitative basée sur la corrélation thématique, et le contenu principal est que la taille de la cohérence est proportionnelle à la qualité du modèle .

C. Effet de regroupement visuel

Semblable au graphique à bulles dans Excel, la taille des bulles représente la fréquence (poids) du sujet apparaissant dans le document, et la distance entre les bulles représente la corrélation entre les sujets. Par conséquent, plus les bulles sont éloignées, meilleur est l'effet de regroupement du modèle.

D. Mesure de distance

Proposée par Cao Juan (2008), la méthode d'utilisation de la similarité entre les sujets pour sélectionner le modèle LDA optimal calcule la similarité des sujets en calculant la distance cosinus et la distance KL des vecteurs de sujets. Lorsque la similarité moyenne des sujets est la plus petite, le modèle du meilleur effet.

E. Écart de sujet

Proposée par Guan Peng (2016), la variance thématique est utilisée pour mesurer la différence globale et la stabilité de l'espace thématique. Lorsque la variance est plus grande, le degré de distinction entre les thèmes est plus grand, indiquant que l'effet du modèle est meilleur.

Cet article utilise les trois premiers, voici le code correspondant :

#-------------计算困惑度-------------------------------------
import codecs
import gensim
from gensim import corpora, models
import matplotlib.pyplot as plt
import matplotlib
from nltk.tokenize import RegexpTokenizer
from nltk.stem.porter import PorterStemmer



fp = codecs.open('./text03.txt','r',encoding='gb18030')
data=fp.read()
fp.close()

#以下几行将train列表的每个元素都生成一个列表 形成列表嵌套
train0=data.split(" ")
train=[]
for i in range(len(train0)):
    train1=[]
    train1.append(train0[i])
    train.append(train1)

dictionary = corpora.Dictionary(train)  # 构建 document-term matrix
corpus = [dictionary.doc2bow(text) for text in train]
Lda = gensim.models.ldamodel.LdaModel
    
def perplexity(num_topics):
    ldamodel = Lda(corpus, num_topics=num_topics, id2word = dictionary, passes=50)  #passes为迭代次数,次数越多越精准
    print(ldamodel.print_topics(num_topics=num_topics, num_words=7))  #num_words为每个主题下的词语数量
    print(ldamodel.log_perplexity(corpus))
    return ldamodel.log_perplexity(corpus)
 
# 绘制困惑度折线图
x = range(1,10)  #主题范围数量
y = [perplexity(i) for i in x]
plt.plot(x, y)
plt.xlabel('主题数目')
plt.ylabel('困惑度大小')
plt.rcParams['font.sans-serif']=['SimHei']
matplotlib.rcParams['axes.unicode_minus']=False
plt.title('主题-困惑度变化情况')
plt.show()

#----------------计算一致性-------------------------------
#计算coherence

from gensim.models.coherencemodel import CoherenceModel
 
def coherence(num_topics):
    ldamodel = Lda(corpus, num_topics=num_topics, id2word = dictionary, passes=30,random_state = 1)
    #print(ldamodel.print_topics(num_topics=num_topics, num_words=7))
    ldacm = CoherenceModel(model=ldamodel, texts=train, dictionary=dictionary, coherence='c_v')
    #print(ldacm.get_coherence())
    return ldacm.get_coherence()

x = range(1,10)
# z = [perplexity(i) for i in x]  #如果想用困惑度就选这个
y = [coherence(i) for i in x]
plt.plot(x, y)
plt.xlabel('主题数目')
plt.ylabel('一致性大小')
plt.rcParams['font.sans-serif']=['SimHei']
matplotlib.rcParams['axes.unicode_minus']=False
plt.title('主题-一致性变化情况')
plt.show()

La perplexité est inversement proportionnelle à la qualité du modèle, et la cohérence est directement proportionnelle à la qualité du modèle. La signification spécifique de la perplexité et de la cohérence peut être trouvée dans des articles connexes, et seule la méthode de mise en œuvre du code est donnée ici.

Selon la perplexité et la cohérence, la plage du nombre de sujets peut être déterminée au préalable, et à l'aide d'effets de regroupement visuels, le nombre approprié de sujets peut être déterminé.

Voici le diagramme d'effet du regroupement visuel :
K = 10, 5 et 4 respectivement
Autre
insérez la description de l'image ici
insérez la description de l'image ici
. D'après la comparaison des trois chiffres ci-dessus, lorsque le nombre de sujets est de 10, les lignes de sujet sont trop fines et le modèle est surajusté ; lorsque le nombre de sujets est de 5, les sujets 2 et 3 se croisent encore partiellement ; lorsque le nombre de sujets est de 4, chaque sujet est éloigné, l'effet de regroupement est évident, et la perplexité du modèle atteint le minimum à condition que les sujets ne se croisent pas. Par conséquent, ce document devrait fixer le nombre de sujets à 4.

Avantages et inconvénients du modèle de sujet LDA

L'avantage du modèle de sujet LDA est qu'il est comparé à l'algorithme de clustering de sujets traditionnel. Par exemple, l'algorithme PLSA considère que la distribution du sujet-document et du mot-sujet est une valeur définie. En termes simples, sélectionnez d'abord un certain sujet avec une certaine probabilité, puis sélectionnez un certain mot sous ce sujet avec une certaine probabilité, et répétez ces deux étapes jusqu'à ce que l'article entier soit généré.

Le modèle de sujet LDA est appelé PLSA dans la version bayésienne. Le modèle LDA adopte l'idée d'école bayésienne, considère tous les paramètres comme des variables aléatoires, et obéit à une certaine distribution a priori de probabilité. Par conséquent, il ajoute deux a priori de Dirichlet à la fois à la distribution des sujets et à la distribution des mots.

L'organigramme structurel du modèle de sujet LDA peut être trouvé sur Internet, il est très courant et ne sera pas donné ici.

Étant donné que le modèle LDA adopte l'idée de l'école bayésienne, dans le cas de petits échantillons et de statistiques de fiabilité, les résultats courants sont plus avantageux que l'école statistique classique ;

Mais le modèle LDA a aussi ses propres limites : par exemple, lors de la vectorisation de texte, le modèle de sac de mots est utilisé. Le modèle du sac de mots ne prend en compte que le nombre de mots, pas l'ordre des mots ; par exemple, en utilisant une matrice pour décrire les mots, lorsque les documents et les mots augmentent, une énorme matrice clairsemée se forme, ce qui peut provoquer des désastres dimensionnels, etc. Certaines méthodes plus avancées, telles que Utiliser la sémantique du contexte pour prédire les mots suivants, etc.

Si vous avez besoin des données et du code de cet article, vous pouvez laisser un message dans la zone de commentaire de cet article ou m'envoyer un message privé.

J'espère vous aider frères et sœurs!

Je suppose que tu aimes

Origine blog.csdn.net/golden_knife/article/details/124413802
conseillé
Classement