自然语言处理之话题建模:Non-Negative Matrix Factorization (NMF):自然语言处理基础

自然语言处理之话题建模:Non-Negative Matrix Factorization (NMF):自然语言处理基础

在这里插入图片描述

自然语言处理简介

NLP的基本概念

自然语言处理(Natural Language Processing,NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究如何处理和运用自然语言;自然语言认知则是指让计算机“懂”人类的语言。NLP建立在语言学、计算机科学和数学统计学的基础之上,旨在使计算机能够理解、解释和生成人类语言。

NLP的应用广泛,包括但不限于:

  • 文本分类:如情感分析、主题分类。
  • 机器翻译:将文本从一种语言翻译成另一种语言。
  • 问答系统:自动回答用户提出的问题。
  • 语音识别:将语音转换为文本。
  • 文本生成:根据给定的规则或模型生成新的文本。

NLP中的文本预处理

文本预处理是NLP中一个关键的步骤,它包括对原始文本进行清洗、分词、去除停用词、词干提取或词形还原等操作,以减少噪音并提高后续处理的效率和准确性。

示例代码:使用Python进行文本预处理

import nltk
from nltk.corpus import stopwords
from nltk.stem import SnowballStemmer
import re

# 下载停用词和分词器
nltk.download('stopwords')
nltk.download('punkt')

# 初始化停用词和词干提取器
stop_words = set(stopwords.words('english'))
stemmer = SnowballStemmer('english')

# 定义预处理函数
def preprocess_text(text):
    # 转换为小写
    text = text.lower()
    # 去除非字母字符
    text = re.sub(r'[^a-z\s]', '', text)
    # 分词
    words = nltk.word_tokenize(text)
    # 去除停用词
    words = [word for word in words if word not in stop_words]
    # 词干提取
    words = [stemmer.stem(word) for word in words]
    # 返回处理后的文本
    return ' '.join(words)

# 示例文本
text = "This is an example sentence, showing off the stop words filtration."

# 预处理文本
processed_text = preprocess_text(text)
print(processed_text)

代码解释

  1. 导入库:使用nltk库进行分词和停用词处理,使用re库进行正则表达式匹配。
  2. 下载资源:下载英语停用词和分词器。
  3. 初始化:设置英语停用词集和词干提取器。
  4. 预处理函数
    • 将文本转换为小写。
    • 使用正则表达式去除非字母字符。
    • 分词,将文本分割成单词列表。
    • 去除停用词,如“is”、“an”、“the”等。
    • 词干提取,将单词还原为其基本形式。
  5. 输出:处理后的文本。

词频-逆文档频率(TF-IDF)计算

词频-逆文档频率(Term Frequency-Inverse Document Frequency,TF-IDF)是一种用于信息检索与数据挖掘的统计方法,用来评价一个词对一个文档集或一个语料库中的其中一份文件的重要程度。词频(TF)是指一个词在文档中出现的频率,逆文档频率(IDF)则是对词频的修正,用来降低常见词的权重,提高罕见词的权重。

示例代码:使用Python计算TF-IDF

from sklearn.feature_extraction.text import TfidfVectorizer

# 示例文本
documents = [
    "This is the first document.",
    "This document is the second document.",
    "And this is the third one.",
    "Is this the first document?"
]

# 初始化TF-IDF向量化器
vectorizer = TfidfVectorizer()

# 计算TF-IDF
tfidf_matrix = vectorizer.fit_transform(documents)

# 输出TF-IDF矩阵
print(tfidf_matrix.toarray())

代码解释

  1. 导入库:使用sklearn库中的TfidfVectorizer类。
  2. 初始化向量化器:创建一个TfidfVectorizer实例。
  3. 计算TF-IDF:使用fit_transform方法对文档集进行向量化,计算TF-IDF值。
  4. 输出矩阵:将计算得到的TF-IDF矩阵输出。

通过上述代码,我们可以看到每个文档中每个词的TF-IDF值,这有助于我们理解哪些词在文档中更为重要。例如,对于罕见词“third”,其TF-IDF值会比常见词“this”高,因为“third”在文档中出现的频率相对较低,但在整个文档集中的出现频率也很低,因此其重要性被强调。

Non-Negative Matrix Factorization(NMF)原理

NMF的基本概念

Non-Negative Matrix Factorization (NMF) 是一种矩阵分解技术,特别适用于分析非负数据集。在自然语言处理(NLP)领域,NMF 被广泛用于话题建模,即从文档集合中自动发现潜在的话题。NMF 的目标是将一个非负矩阵分解为两个非负矩阵的乘积,这在处理文本数据时非常有用,因为文本数据通常表示为词频或TF-IDF值的非负矩阵。

例子

假设我们有以下文档集合的词频矩阵:

文档词1词2词3词4词5
D130402
D205103
D320321

这个矩阵可以表示为 V V V,其中 V i j V_{ij} Vij表示第 i i i个文档中第 j j j个词的频率。NMF 的目标是找到两个矩阵 W W W H H H,使得 V ≈ W H V \approx WH VWH

NMF与矩阵分解

NMF 是一种特殊的矩阵分解方法,它确保所有矩阵元素都是非负的。这在处理如图像、文本等数据时非常重要,因为这些数据的表示通常是非负的。NMF 的分解结果 W W W H H H可以被解释为有意义的特征和这些特征在原始数据中的权重。

代码示例

使用 Python 的 scikit-learn 库进行 NMF:

from sklearn.decomposition import NMF
from sklearn.feature_extraction.text import TfidfVectorizer

# 文档集合
documents = [
    "I love machine learning",
    "I love data science",
    "I love natural language processing"
]

# 将文本转换为 TF-IDF 矩阵
vectorizer = TfidfVectorizer()
V = vectorizer.fit_transform(documents)

# 初始化 NMF 模型
nmf = NMF(n_components=2)

# 拟合模型
W = nmf.fit_transform(V)
H = nmf.components_

# 输出结果
print("W (文档-主题权重):")
print(W)
print("H (主题-词权重):")
print(H)

NMF的数学基础

NMF 的数学基础在于最小化重构误差。给定一个非负矩阵 V V V,NMF 寻找两个非负矩阵 W W W H H H,使得 V ≈ W H V \approx WH VWH,其中 W W W是文档-主题矩阵, H H H是主题-词矩阵。重构误差通常通过最小化 V V V W H WH WH之间的欧氏距离或 Kullback-Leibler 散度来实现。

例子

假设 V V V是一个 m × n m \times n m×n的矩阵, W W W是一个 m × k m \times k m×k的矩阵, H H H是一个 k × n k \times n k×n的矩阵,其中 k k k是主题的数量。NMF 的目标是找到 W W W H H H,使得:

min ⁡ W , H ∣ ∣ V − W H ∣ ∣ 2 \min_{W,H} ||V - WH||^2 W,Hmin∣∣VWH2

其中 ∣ ∣ ⋅ ∣ ∣ ||\cdot|| ∣∣∣∣表示欧氏范数。

代码示例

scikit-learn 中,可以通过调整 NMF 类的参数来控制使用的误差度量:

from sklearn.decomposition import NMF
from sklearn.feature_extraction.text import TfidfVectorizer

# 文档集合
documents = [
    "I love machine learning",
    "I love data science",
    "I love natural language processing"
]

# 将文本转换为 TF-IDF 矩阵
vectorizer = TfidfVectorizer()
V = vectorizer.fit_transform(documents)

# 初始化 NMF 模型,使用 Kullback-Leibler 散度作为误差度量
nmf = NMF(n_components=2, beta_loss='kullback-leibler')

# 拟合模型
W = nmf.fit_transform(V)
H = nmf.components_

# 输出结果
print("W (文档-主题权重):")
print(W)
print("H (主题-词权重):")
print(H)

通过以上示例,我们可以看到 NMF 在自然语言处理中的应用,以及如何使用 Python 的 scikit-learn 库来实现这一技术。NMF 不仅能够帮助我们理解文档集合中的潜在话题,还能够提供一种直观的方式来解释这些话题。

NMF在话题建模中的应用

文本表示为词频矩阵

在自然语言处理中,将文本数据转换为数值表示是进行机器学习和数据分析的首要步骤。词频矩阵是一种常见的文本表示方法,它记录了文档集合中每个词出现的频率。

示例数据

假设我们有以下三篇文档:

  1. “自然语言处理是人工智能的重要组成部分。”
  2. “人工智能正在改变我们的生活。”
  3. “自然语言处理和机器学习是紧密相关的。”

构建词频矩阵

首先,我们需要创建一个词汇表,包含所有文档中出现的词。然后,对于每篇文档,我们计算每个词的出现次数,形成一个矩阵。

from sklearn.feature_extraction.text import CountVectorizer

# 文档集合
documents = [
    "自然语言处理是人工智能的重要组成部分。",
    "人工智能正在改变我们的生活。",
    "自然语言处理和机器学习是紧密相关的。"
]

# 创建CountVectorizer对象
vectorizer = CountVectorizer()

# 构建词频矩阵
X = vectorizer.fit_transform(documents)

# 获取词汇表
features = vectorizer.get_feature_names_out()

# 打印词频矩阵
print("词频矩阵:")
print(X.toarray())
print("词汇表:")
print(features)

词频矩阵解释

输出的词频矩阵将显示每篇文档中每个词的出现次数,而词汇表则列出了所有词。

使用NMF进行话题提取

Non-Negative Matrix Factorization (NMF) 是一种用于将矩阵分解为两个非负矩阵的算法,特别适用于文本数据的话题建模。NMF 将词频矩阵分解为两个矩阵:一个表示文档-话题矩阵,另一个表示话题-词矩阵。

示例代码

使用NMF进行话题提取的步骤如下:

  1. 应用NMF算法分解词频矩阵。
  2. 分析话题-词矩阵,确定每个话题的关键词。
  3. 使用文档-话题矩阵,为每篇文档分配话题。
from sklearn.decomposition import NMF

# NMF模型初始化
nmf = NMF(n_components=2, random_state=1)

# 拟合模型
W = nmf.fit_transform(X)

# 获取话题-词矩阵
H = nmf.components_

# 打印话题-词矩阵
print("话题-词矩阵:")
print(H)

# 解释话题
n_top_words = 5
topic_words = []
for topic_idx, topic in enumerate(H):
    top_words = [features[i] for i in topic.argsort()[:-n_top_words - 1:-1]]
    topic_words.append(top_words)
    print(f"话题 {topic_idx}: {top_words}")

话题提取解释

通过分析话题-词矩阵,我们可以找出与每个话题最相关的词,从而理解话题的内容。文档-话题矩阵则显示了每篇文档与每个话题的关联程度。

话题建模的评估方法

评估话题模型的有效性通常涉及以下几种方法:

  1. 主题连贯性:衡量话题中词的语义连贯性。
  2. 困惑度:评估模型对新文档的预测能力。
  3. 人工评估:专家对话题质量的主观评价。

示例:主题连贯性评估

主题连贯性可以通过计算话题中词的共现频率来评估。一个连贯的话题,其关键词在文档中应该经常一起出现。

from gensim.models import CoherenceModel

# 使用Gensim库计算主题连贯性
coherence_model = CoherenceModel(topics=topic_words, texts=documents, dictionary=vectorizer.vocabulary_)
coherence = coherence_model.get_coherence()

print(f"主题连贯性: {coherence}")

评估方法解释

主题连贯性评估通过计算话题中词的共现频率来衡量话题的语义连贯性,而困惑度则用于评估模型的预测能力,人工评估则依赖于领域专家的主观判断。


以上示例展示了如何使用NMF进行话题建模,并提供了评估话题模型质量的方法。通过这些步骤,我们可以从大量文本数据中自动提取出有意义的话题,为文本分析和信息检索提供支持。

NMF与其它话题建模方法比较

NMF与LDA的比较

原理

Non-Negative Matrix Factorization (NMF) 和 Latent Dirichlet Allocation (LDA) 都是用于话题建模的流行技术,但它们在假设和优化目标上存在显著差异。

  • NMF:NMF 假设数据矩阵可以分解为两个非负矩阵的乘积,即 V ≈ W H V \approx WH VWH,其中 V V V 是原始数据矩阵, W W W H H H 是分解后的矩阵。在自然语言处理中, V V V 可以是文档-词频矩阵, W W W 可以解释为词-话题矩阵, H H H 为文档-话题矩阵。NMF 通过最小化重构误差来优化分解结果,通常使用梯度下降或交替最小化等方法。

  • LDA:LDA 是一种基于概率的生成模型,它假设文档由多个话题组成,每个话题由一组词的概率分布表示。LDA 通过最大化后验概率来估计话题和词的分布,即 P ( θ , β ∣ V ) P(\theta, \beta|V) P(θ,βV),其中 θ \theta θ 是文档的话题分布, β \beta β 是话题的词分布, V V V 是文档集合。LDA 使用 Gibbs 采样或变分推断等方法进行参数估计。

代码示例

假设我们有一个文档-词频矩阵 V,我们可以使用 Python 的 sklearn 库来实现 NMF 和 LDA 的话题建模。

NMF
from sklearn.decomposition import NMF
from sklearn.feature_extraction.text import CountVectorizer

# 假设我们有以下文档
documents = [
    "I love machine learning",
    "I love natural language processing",
    "I love data mining"
]

# 将文档转换为词频矩阵
vectorizer = CountVectorizer()
V = vectorizer.fit_transform(documents)

# 使用NMF进行话题建模
nmf = NMF(n_components=2, random_state=1)
W = nmf.fit_transform(V)
H = nmf.components_

# 输出话题
print("NMF Topics:")
for topic_idx, topic in enumerate(H):
    print(f"Topic {topic_idx + 1}:")
    print([vectorizer.get_feature_names_out()[i] for i in topic.argsort()[:-5:-1]])
LDA
from sklearn.decomposition import LatentDirichletAllocation

# 使用LDA进行话题建模
lda = LatentDirichletAllocation(n_components=2, random_state=1)
W = lda.fit_transform(V)

# 输出话题
print("LDA Topics:")
for topic_idx, topic in enumerate(lda.components_):
    print(f"Topic {topic_idx + 1}:")
    print([vectorizer.get_feature_names_out()[i] for i in topic.argsort()[:-5:-1]])

描述

在上述代码中,我们首先使用 CountVectorizer 将文档转换为词频矩阵。然后,我们分别使用 NMF 和 LDA 对矩阵进行分解,以识别潜在的话题。最后,我们输出每个话题中最重要的词,以直观地理解话题的内容。

NMF与PCA的比较

原理

NMF 和 Principal Component Analysis (PCA) 都是矩阵分解技术,但它们的目标和适用场景不同。

  • NMF:如前所述,NMF 的目标是找到两个非负矩阵的乘积,以近似原始数据矩阵。这使得 NMF 在处理非负数据(如词频)时特别有效,因为它可以解释数据的加性结构。

  • PCA:PCA 的目标是找到数据的主成分,即数据的线性组合,这些组合解释了数据的大部分方差。PCA 不限制矩阵元素的正负性,因此它适用于更广泛的数据类型,但可能不适用于解释非负数据的加性结构。

代码示例

使用相同的文档-词频矩阵 V,我们可以比较 NMF 和 PCA 的结果。

PCA
from sklearn.decomposition import PCA

# 使用PCA进行数据降维
pca = PCA(n_components=2)
W_pca = pca.fit_transform(V.toarray())

# 输出PCA结果
print("PCA Results:")
print(W_pca)

描述

PCA 的输出是一个降维后的数据矩阵,而不是像 NMF 或 LDA 那样的话题模型。PCA 更多地用于数据可视化和降维,而不是话题识别。

NMF在NLP中的优势与局限性

优势

  • 非负性:NMF 的非负性约束使得它在处理词频等非负数据时更加直观和解释性强。
  • 加性模型:NMF 的加性模型意味着它可以直接解释数据的组合结构,这对于话题建模特别有用。
  • 易于实现:NMF 的优化目标和算法相对简单,易于理解和实现。

局限性

  • 非唯一性:NMF 的分解结果可能不是唯一的,不同的初始化可能导致不同的分解结果。
  • 缺乏概率解释:与 LDA 相比,NMF 缺乏概率解释,这可能使得结果的解释性较差。
  • 对噪声敏感:NMF 对数据中的噪声和异常值比较敏感,可能需要预处理步骤来减少这种影响。

通过上述比较,我们可以看到 NMF 在自然语言处理中的独特优势和局限性,以及它与其他话题建模方法的差异。选择合适的方法取决于具体的应用场景和数据特性。

NMF在NLP中的实践案例

新闻分类

原理与内容

在新闻分类中,Non-Negative Matrix Factorization (NMF) 可以用于提取新闻文章的主题,从而帮助分类。NMF 将一个非负矩阵分解为两个非负矩阵的乘积,这在处理文本数据时特别有用,因为文本数据通常表示为非负的词频矩阵。

假设我们有 m 篇新闻文章和 n 个不同的词汇,可以构建一个 m x n 的词频矩阵 V。NMF 将 V 分解为两个矩阵 WH,其中 Wm x k 的矩阵,表示每篇文章在 k 个主题上的权重;Hk x n 的矩阵,表示每个主题中词汇的权重。

示例代码

# 导入所需库
from sklearn.decomposition import NMF
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.datasets import fetch_20newsgroups

# 加载新闻数据集
newsgroups = fetch_20newsgroups(subset='all')
vectorizer = TfidfVectorizer(max_df=0.95, min_df=2, stop_words='english')
V = vectorizer.fit_transform(newsgroups.data)

# 应用NMF
nmf = NMF(n_components=20)
W = nmf.fit_transform(V)
H = nmf.components_

# 打印主题词汇
def display_topics(model, feature_names, no_top_words):
    for topic_idx, topic in enumerate(model.components_):
        print("Topic %d:" % (topic_idx))
        print(" ".join([feature_names[i]
                        for i in topic.argsort()[:-no_top_words - 1:-1]]))

no_top_words = 10
tfidf_feature_names = vectorizer.get_feature_names_out()
display_topics(nmf, tfidf_feature_names, no_top_words)

情感分析

原理与内容

NMF 可以用于情感分析,通过分解文本数据,识别出与正面或负面情感相关的主题。这有助于理解文本中情感的分布,从而进行情感分类或情感倾向性分析。

示例代码

# 导入所需库
from sklearn.decomposition import NMF
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.datasets import fetch_20newsgroups
import numpy as np

# 加载新闻数据集,这里假设正面和负面新闻分别在不同的类别中
newsgroups_pos = fetch_20newsgroups(subset='all', categories=['comp.graphics'])
newsgroups_neg = fetch_20newsgroups(subset='all', categories=['rec.sport.hockey'])
data = np.concatenate((newsgroups_pos.data, newsgroups_neg.data))
vectorizer = CountVectorizer()
V = vectorizer.fit_transform(data)

# 应用NMF
nmf = NMF(n_components=2)
W = nmf.fit_transform(V)
H = nmf.components_

# 分析主题
def analyze_sentiment(W, data):
    sentiments = []
    for i in range(len(W)):
        if W[i][0] > W[i][1]:
            sentiments.append("Positive")
        else:
            sentiments.append("Negative")
    return sentiments

sentiments = analyze_sentiment(W, data)
print(sentiments[:10])

文档摘要

原理与内容

NMF 可以用于文档摘要,通过识别文档中最重要的主题,从而提取出关键信息。这通常涉及到将文档表示为词频矩阵,然后使用 NMF 分解矩阵,最后根据主题权重选择最相关的句子作为摘要。

示例代码

# 导入所需库
from sklearn.decomposition import NMF
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.datasets import fetch_20newsgroups
from nltk.tokenize import sent_tokenize

# 加载新闻数据集
newsgroups = fetch_20newsgroups(subset='all')
vectorizer = TfidfVectorizer(max_df=0.95, min_df=2, stop_words='english')
V = vectorizer.fit_transform(newsgroups.data)

# 应用NMF
nmf = NMF(n_components=5)
W = nmf.fit_transform(V)
H = nmf.components_

# 文档摘要
def document_summary(W, data, n_sentences=3):
    summaries = []
    for i in range(len(W)):
        topic_weights = W[i]
        top_topic = topic_weights.argmax()
        sentences = sent_tokenize(data[i])
        sentence_scores = []
        for sentence in sentences:
            sentence_vector = vectorizer.transform([sentence])
            sentence_score = np.dot(sentence_vector, H[:, top_topic].T).toarray()[0][0]
            sentence_scores.append(sentence_score)
        top_sentences = [sentences[i] for i in np.argsort(sentence_scores)[-n_sentences:]]
        summaries.append(" ".join(top_sentences))
    return summaries

summaries = document_summary(W, newsgroups.data)
print(summaries[0])

以上代码示例展示了如何使用 NMF 进行新闻分类、情感分析和文档摘要。通过分解词频矩阵,NMF 能够识别出文本中的主题,进而应用于不同的自然语言处理任务。

NMF的Python实现

使用sklearn库进行NMF

在自然语言处理中,非负矩阵分解(NMF)是一种用于主题建模的有效技术。它将一个大矩阵分解为两个较小的矩阵,其中一个矩阵表示文档的主题,另一个矩阵表示主题的词频。通过使用Python的sklearn库,我们可以轻松地实现NMF。

示例代码

# 导入必要的库
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import NMF
import matplotlib.pyplot as plt
import numpy as np
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import Normalizer
from sklearn import metrics

# 加载数据集
newsgroups = fetch_20newsgroups(subset='all', remove=('headers', 'footers', 'quotes'))

# 使用TF-IDF向量化文本
tfidf_vectorizer = TfidfVectorizer(max_df=0.95, min_df=2, max_features=1000, stop_words='english')
tfidf = tfidf_vectorizer.fit_transform(newsgroups.data)

# 创建NMF模型
nmf = NMF(n_components=20, random_state=1)

# 训练模型
W = nmf.fit_transform(tfidf)
H = nmf.components_

# 可视化结果
def display_topics(model, feature_names, no_top_words):
    for topic_idx, topic in enumerate(model.components_):
        print("Topic %d:" % (topic_idx))
        print(" ".join([feature_names[i]
                        for i in topic.argsort()[:-no_top_words - 1:-1]]))

no_top_words = 10
display_topics(nmf, tfidf_vectorizer.get_feature_names_out(), no_top_words)

代码解释

  1. 数据加载:我们使用sklearn.datasets中的fetch_20newsgroups函数加载新闻组数据集,这是一个常用的数据集,用于文本分类和主题建模。
  2. 文本向量化:使用TfidfVectorizer将文本转换为TF-IDF特征向量,这是一种衡量词在文档中重要性的方法。
  3. 创建NMF模型:通过NMF类创建模型,设置主题数量为20。
  4. 训练模型:使用fit_transform方法训练模型并转换数据。
  5. 结果可视化:定义一个函数display_topics来显示每个主题的前10个关键词。

NMF模型的训练与调参

NMF模型的训练涉及选择合适的参数,如主题数量、迭代次数等。调参是优化模型性能的关键步骤。

示例代码

# 创建NMF模型并设置参数
nmf = NMF(n_components=20, init='random', random_state=0, max_iter=1000)

# 训练模型
W = nmf.fit_transform(tfidf)

# 调整参数并重新训练
nmf.set_params(max_iter=2000)
W = nmf.fit_transform(tfidf)

# 评估模型
def purity_score(y_true, y_pred):
    # 计算纯度分数
    contingency_matrix = metrics.cluster.contingency_matrix(y_true, y_pred)
    return np.sum(np.amax(contingency_matrix, axis=0)) / np.sum(contingency_matrix)

# 使用纯度分数评估模型
purity = purity_score(newsgroups.target, np.argmax(W, axis=1))
print("Purity Score: ", purity)

代码解释

  1. 模型初始化:设置init='random'表示随机初始化,max_iter=1000表示最大迭代次数。
  2. 调整参数:通过set_params方法调整模型参数,例如增加迭代次数。
  3. 评估模型:定义一个函数purity_score来计算模型的纯度分数,这是一种评估聚类模型性能的指标。

结果可视化与解释

可视化NMF的结果可以帮助我们更好地理解主题的构成和文档的分布。

示例代码

# 可视化主题词
def plot_top_words(model, feature_names, n_top_words, title):
    fig, axes = plt.subplots(2, 10, figsize=(30, 15), sharex=True)
    axes = axes.flatten()
    for topic_idx, topic in enumerate(model.components_):
        top_features_ind = topic.argsort()[:-n_top_words - 1:-1]
        top_features = [feature_names[i] for i in top_features_ind]
        weights = topic[top_features_ind]

        ax = axes[topic_idx]
        ax.barh(top_features, weights, height=0.7)
        ax.set_title(f'Topic {topic_idx +1}',
                     fontdict={'fontsize': 30})
        ax.invert_yaxis()
        ax.tick_params(axis='both', which='major', labelsize=20)
        for i in 'top right left'.split():
            ax.spines[i].set_visible(False)
        fig.suptitle(title, fontsize=40)

    plt.subplots_adjust(top=0.90, bottom=0.05, wspace=0.90, hspace=0.3)
    plt.show()

# 可视化结果
plot_top_words(nmf, tfidf_vectorizer.get_feature_names_out(), no_top_words, "NMF Topics")

代码解释

  1. 定义可视化函数plot_top_words函数接受NMF模型、特征名称、要显示的词数量和标题作为参数,生成一个条形图来显示每个主题的关键词。
  2. 调用可视化函数:使用tfidf_vectorizer.get_feature_names_out()获取特征名称,然后调用plot_top_words函数来可视化NMF的结果。

通过上述步骤,我们可以使用Python的sklearn库实现NMF,训练模型,调整参数,并可视化结果,从而更好地理解文本数据中的主题结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值