首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python主题建模可视化LDA和T-SNE交互式可视化

我们将涉及以下几点

使用LDA进行主题建模

使用pyLDAvis可视化主题模型

使用t-SNE可视化LDA结果

相关视频:文本挖掘:主题模型(LDA)及R语言实现分析游记数据

文本挖掘:主题模型(LDA)及R语言实现分析游记数据

时长12:59

In [1]:

from scipy import sparse as sp

Populating the interactive namespace from numpy and matplotlib

In [2]:

docs = array(p_df\['PaperText'\]) 预处理和矢量化文档

In [3]:

from nltk.stem.wordnet import WordNetLemmatizer

from nltk.tokenize import RegexpTokenizer

def docs_preprocessor(docs):

tokenizer = RegexpTokenizer(r'\\w+')

for idx in range(len(docs)):

docs\[idx\] = docs\[idx\].lower()  # Convert to lowercase.

docs\[idx\] = tokenizer.tokenize(docs\[idx\])  # Split into words.

# 删除数字,但不要删除包含数字的单词。

docs = \[\[token for token in doc if not token.isdigit()\] for doc in docs\]

# 删除仅一个字符的单词。

docs = \[\[token for token in doc if len(token) > 3\] for doc in docs\]

# 使文档中的所有单词规则化

lemmatizer = WordNetLemmatizer()

docs = \[\[lemmatizer.lemmatize(token) for token in doc\] for doc in docs\]

return docs

In [4]:

docs = docs_preprocessor(docs) 计算双字母组/三元组:

主题非常相似,可以区分它们是短语而不是单个单词。

In [5]:

from gensim.models import Phrases

# 向文档中添加双字母组和三字母组(仅出现10次或以上的文档)。

bigram = Phrases(docs, min_count=10)

trigram = Phrases(bigram\[docs\])

for idx in range(len(docs)):

for token in bigram\[docs\[idx\]\]:

if '_' in token:

# Token is a bigram, add to document.

docs\[idx\].append(token)

for token in trigram\[docs\[idx\]\]:

if '_' in token:

# token是一个二元组,添加到文档中。

docs\[idx\].append(token)

Using TensorFlow backend.

/opt/conda/lib/python3.6/site-packages/gensim/models/phrases.py:316: UserWarning: For a faster implementation, use the gensim.models.phrases.Phraser class

warnings.warn("For a faster implementation, use the gensim.models.phrases.Phraser class")删除

In [6]:

from gensim.corpora import Dictionary

# 创建文档的字典表示

dictionary = Dictionary(docs)

print('Number of unique words in initital documents:', len(dictionary))

# 过滤掉少于10个文档或占文档20%以上的单词。

dictionary.filter\_extremes(no\_below=10, no_above=0.2)

print('Number of unique words after removing rare and common words:', len(dictionary))

Number of unique words in initital documents: 39534

Number of unique words after removing rare and common words: 6001

清理常见和罕见的单词,我们最终只有大约6%的词。

矢量化数据:

第一步是获得每个文档的单词表示。

In [7]:

corpus = \[dictionary.doc2bow(doc) for doc in docs\]

In [8]:

print('Number of unique tokens: %d' % len(dictionary))

print('Number of documents: %d' % len(corpus))

Number of unique tokens: 6001

Number of documents: 403

通过词袋语料库,我们可以继续从文档中学习我们的主题模型。

训练LDA模型 

In [9]:

from gensim.models import LdaModel

In [10]:

%time model = LdaModel(corpus=corpus, id2word=id2word, chunksize=chunksize, \

alpha='auto', eta='auto', \

iterations=iterations, num\_topics=num\_topics, \

passes=passes, eval\_every=eval\_every)

CPU times: user 3min 58s, sys: 348 ms, total: 3min 58s

Wall time: 3min 59s如何选择主题数量?

LDA是一种无监督的技术,这意味着我们在运行模型之前不知道在我们的语料库中有多少主题存在。 主题连贯性是用于确定主题数量的主要技术之一。

但是,我使用了LDA可视化工具pyLDAvis,尝试了几个主题并比较了结果。 四个似乎是最能分离主题的最佳主题数量。

In [11]:

import pyLDAvis.gensim

pyLDAvis.enable_notebook()

import warnings

warnings.filterwarnings("ignore", category=DeprecationWarning)

In [12]:

Out[12]:

我们在这看到什么?

左侧面板,标记为Intertopic Distance Map,圆圈表示不同的主题以及它们之间的距离。类似的主题看起来更近,而不同的主题更远。图中主题圆的相对大小对应于语料库中主题的相对频率。

如何评估我们的模型? 

将每个文档分成两部分,看看分配给它们的主题是否类似。 =>越相似越好

将随机选择的文档相互比较。 =>越不相似越好

In [13]:

from sklearn.metrics.pairwise import cosine_similarity

p_df\['tokenz'\] = docs

docs1 = p_df\['tokenz'\].apply(lambda l: l\[:int0(len(l)/2)\])

docs2 = p_df\['tokenz'\].apply(lambda l: l\[int0(len(l)/2):\])

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OzzxBQ7CwByr_V10sFe9AzZw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券