【 文本到上下文 #4】NLP 与 ML

一、说明

        欢迎回到我们的 NLP 博客系列!当我们进入第四部分时,焦点转移到机器学习 (ML) 和自然语言处理 (NLP) 之间的动态相互作用上。在本章中,我们将深入探讨 ML 和 NLP 的迷人协同作用,解开理论概念和实际应用。

        AI、ML 和 NLP 虽然经常互换使用,但具有特定的作用。人工智能模拟人类智能,而NLP允许机器理解和解释语言。机器学习在人工智能的保护伞下,实现了自主学习和改进。这种协同作用使 NLP 任务自动化,提高了准确性和效率。

        以下是本章中您可以期待的内容:

  1. 了解 NLP 中的监督学习和无监督学习: 本节将阐明监督学习和无监督学习在 NLP 背景下的核心区别和独特应用。通过了解这些基本的 ML 方法,您将深入了解它们如何驱动各种 NLP 任务和应用程序。
  2. 情感分析:(监督)ML在NLP中的实际应用:深入研究情感分析的世界,其中监督式 ML 技术用于解释和分类文本数据中的情感。本节将展示如何训练和应用监督学习模型以从文本中提取有意义的见解,强调它们在 NLP 中的实际效用。
  3. 主题建模:(无监督)ML在NLP中的实际应用:探索主题建模,这是一种无监督 ML 应用程序,可发现大型文本语料库中隐藏的主题结构。本部分将演示无监督学习算法如何检测模式和主题,为了解大量文本数据集中存在的潜在主题提供一个窗口。

二、了解 NLP 中的监督学习和无监督学习

        在机器学习领域,有两种基本范式:监督学习和无监督学习。 监督学习涉及在标记数据集上训练模型,其中算法学习将输入数据映射到相应的输出标签。另一方面,无监督学习处理未标记的数据,旨在发现信息中隐藏的模式或分组。

        对于自然语言处理 (NLP) 来说,机器学习就像语言侦探一样——帮助我们理解单词和短语。想象一下,教计算机理解电影评论是在竖起大拇指还是竖起大拇指。这就是我们在NLP中对监督学习所做的。另一方面,无监督学习就像一个熟练的探索者,帮助我们在一堆没有任何标签的文本中找到隐藏的模式。可以把它想象成在一堆文章中揭示主要主题。

        让我们直接进入有趣的区域,从情感分析的快感开始,然后进入主题建模的迷人世界。准备好冒险了吗?让编码奇迹开始吧! 

三、情感分析:(监督)ML在NLP中的实际应用

        ML 在 NLP 中最普遍和最实际的应用之一是情感分析。此任务涉及确定一段文本中表达的情绪,无论是积极的、消极的还是中性的。想象一下,当大规模自动分析情绪时,可以从客户评论、社交媒体帖子或产品反馈中收集到丰富的见解。

        IMDB评论:使用代码进行情感分析

【 文本到上下文 #4】NLP 与 ML_第1张图片

        为了将这些概念变为现实,让我们开始一个现实世界的项目——为 IMDB 评论构建情感分析模型。在此示例中,我们将使用流行的 ML 框架和库(例如 sci-kit learn、pandas)来指导您完成该过程的每个步骤。

# Import necessary libraries
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report

# Function to load IMDb dataset
def load_data():
    df = pd.read_csv('data/movie.csv')
    return df['text'], df['label']

# Function to preprocess data (split into training and testing sets)
def preprocess_data(text, label):
    X_train, X_test, y_train, y_test = train_test_split(text, label, test_size=0.2, random_state=42)
    return X_train, X_test, y_train, y_test

# Function to vectorize text data using CountVectorizer
def vectorize_text(X_train, X_test):
    vectorizer = CountVectorizer()
    X_train_vec = vectorizer.fit_transform(X_train)
    X_test_vec = vectorizer.transform(X_test)
    return X_train_vec, X_test_vec, vectorizer  # Return the vectorizer as well to test random text 

# Function to train a Naive Bayes classifier
def train_model(X_train_vec, y_train):
    classifier = MultinomialNB()
    classifier.fit(X_train_vec, y_train)
    return classifier

# Function to evaluate the trained model
def evaluate_model(classifier, X_test_vec, y_test):
    y_pred = classifier.predict(X_test_vec)
    accuracy = accuracy_score(y_test, y_pred)
    report = classification_report(y_test, y_pred)
    return accuracy, report

# Main function
def main():
    # Step 1: Load data
    text, label = load_data()

    # Step 2: Preprocess data
    X_train, X_test, y_train, y_test = preprocess_data(text, label)

    # Step 3: Vectorize text data
    X_train_vec, X_test_vec, vectorizer = vectorize_text(X_train, X_test)  # Capture the vectorizer

    # Step 4: Train the model
    classifier = train_model(X_train_vec, y_train)

    # Step 5: Evaluate the model
    accuracy, report = evaluate_model(classifier, X_test_vec, y_test)

    # Display results
    print(f"Accuracy: {accuracy:.2f}")
    print("Classification Report:\n", report)

    # Test random text with the trained model
    test_text = ["This movie was fantastic!", "I didn't like the plot."]
    test_text_vec = vectorizer.transform(test_text)
    predictions = classifier.predict(test_text_vec)
    print("\nTest Text Predictions:", predictions)

if __name__ == "__main__":
    main()
Accuracy: 0.85
Classification Report:
               precision    recall  f1-score   support

           0       0.83      0.89      0.86      3966
           1       0.88      0.82      0.85      4034

    accuracy                           0.85      8000
   macro avg       0.85      0.85      0.85      8000
weighted avg       0.85      0.85      0.85      8000


Test Text Predictions: [1 0]

        项目步骤:

  1. 加载 IMDb 数据集:我们首先加载我们的 IMDb 数据集,该数据集由电影评论和相应的情感标签(正面或负面)组成。
  2. 数据预处理: 然后,通过使用 scikit-learn 库将数据拆分为训练集和测试集,对数据进行预处理。这一步对于训练和评估模型的性能至关重要。
  3. 文本矢量化:使用 scikit-learn 的 CountVectorizer 将电影评论文本转换为数字特征。此过程将原始文本数据转换为适合机器学习算法的格式。
  4. 训练模型:我们使用 scikit-learn 中的 MultinomialNB 类训练朴素贝叶斯分类器,这是文本分类任务的常用选择。此步骤涉及教导模型识别矢量化文本数据中的模式。
  5. 模型评估:在测试集上对经过训练的模型进行评估,以评估其准确性和性能。我们使用准确性分数和分类报告等指标来衡量模型对看不见的数据的泛化程度。
  6. 使用随机文本进行测试:为了证明该模型在现实世界中的适用性,我们用随机的电影评论文本对其进行了测试。这展示了我们的情感分析模型在训练数据之外进行预测的灵活性。

        建立IMDB情感分析模型不仅可以深入了解电影评论中表达的情感,还可以作为NLP和文本分类的极好介绍。该项目演示了准备数据、训练模型和评估其性能的分步过程,为那些涉足令人兴奋的自然语言处理领域的人们提供了一个实际示例。

四、主题建模:(无监督)ML在NLP中的实际应用

        在自然语言处理 (NLP) 中的无监督学习领域,主题建模仍然是一个迷人的应用程序。这种技术使我们能够在文本文档集合中挖掘潜在的主题,在不依赖预定义标签的情况下揭示潜在的主题。

        使用代码对研究文章进行主题建模

        现在,让我们深入研究我们的第二个 NLP 项目——为研究文章制作主题建模工作。在本例中,我们将采用无监督学习技术来提取非结构化文本中的隐藏对话,重点关注“TITLE”和“ABSTRACT”列。

# Import necessary libraries
from sklearn.decomposition import LatentDirichletAllocation
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd

# Function to load research articles dataset
def load_data():
    df = pd.read_csv('data/research_articles.csv')
    return df['TITLE'] + ' ' + df['ABSTRACT']
    
# Function to vectorize text data using TfidfVectorizer
def vectorize_text_tfidf(text):
    vectorizer = TfidfVectorizer(max_df=0.95, min_df=2, stop_words='english')
    X_vec = vectorizer.fit_transform(text)
    return X_vec, vectorizer
    
# Function to train a Latent Dirichlet Allocation (LDA) model
def train_lda_model(X_vec, num_topics):
    lda_model = LatentDirichletAllocation(n_components=num_topics, random_state=42)
    lda_model.fit(X_vec)
    return lda_model
    
# Function to display the top words for each topic
def display_topics(model, feature_names, num_top_words):
    topics = {}
    for topic_idx, topic in enumerate(model.components_):
        topics[f"Topic {topic_idx+1}"] = [feature_names[i] for i in topic.argsort()[:-num_top_words - 1:-1]]
    return topics
    
# Main function for Topic Modeling
def main_topic_modeling(text, num_topics=5, num_top_words=10):
    # Step 1: Vectorize text data using TfidfVectorizer
    X_vec, vectorizer = vectorize_text_tfidf(text)
    
    # Step 2: Train a Latent Dirichlet Allocation (LDA) model
    lda_model = train_lda_model(X_vec, num_topics)
    
    # Step 3: Display the top words for each topic
    feature_names = vectorizer.get_feature_names_out()
    topics = display_topics(lda_model, feature_names, num_top_words)
    
    # Display the topics
    print(f"\nTop {num_top_words} words for each topic:")
    for topic, words in topics.items():
        print(f"{topic}: {', '.join(words)}")

if __name__ == "__main__":
    text_data = load_data()
    main_topic_modeling(text_data, num_topics=5, num_top_words=10)
Top 10 words for each topic:
Topic 1: quantum, energy, spin, model, magnetic, phase, field, time, temperature, wave
Topic 2: learning, data, model, network, networks, based, algorithm, models, neural, problem
Topic 3: mn, doping, floquet, fese, t_c, soc, kitaev, semimetals, mos2, verma
Topic 4: qa, nmf, hedging, opioid, password, gerrymandering, hashtags, triad, fuzzing, sequent
Topic 5: mathbb, prove, group, mathcal, finite, groups, theorem, spaces, algebra, space

        项目步骤:

  1. 加载研究文章数据集:首先加载包含研究文章的数据集,重点关注“TITLE”和“ABSTRACT”列。
  2. 使用 TfidfVectorizer 进行文本矢量化:使用 TfidfVectorizer 将研究文章文本转换为数字特征,同时考虑每个文档中单词的重要性。
  3. 训练潜在狄利克雷分配 (LDA) 模型:使用 LDA 算法来揭示研究文章中隐藏的主题。LDA 假定每个文档都是主题的混合体,并且每个主题都是单词的混合体(有关更多信息,请访问链接)。
  4. 显示每个主题的热门词:通过展示与每个发现的主题相关的热门词来可视化结果。

        冒险进行研究文章的主题建模项目不仅可以增强我们对文章内容的理解,还可以强调NLP中无监督学习的灵活性。该项目提供了从文本矢量化到揭示潜在主题的顺序过程的实际探索,为进入自然语言处理这一有趣领域的爱好者提供了宝贵的见解。

五、结论

        总之,我们对机器学习(ML)和自然语言处理(NLP)的探索已经阐明了它们的不同作用。ML 作为更广泛的 AI 的一个子集,为自主学习提供动力,而 NLP 则解释和理解语言。

        通过监督学习,我们解开了情感分析,从IMDB评论中提取情感。过渡到无监督学习,主题建模揭示了研究文章中隐藏的主题。

        最后,我们的旅程延伸到 NLP 的深度学习基础。请继续关注我们对神经网络、递归神经网络 (RNN) 和长短期记忆 (LSTM) 网络的探索——这是我们正在进行的 NLP 与 ML 探索的激动人心的篇章。

你可能感兴趣的:(NLP高级和ChatGPT,人工智能,自然语言处理,人工智能)