• NLP(文本处理技术)在数据分析中的应用实例


    在Python中,你可以实现多种自然语言处理(NLP)技术。Python拥有丰富的库和框架,使得NLP任务变得更加容易和高效。接下来将列举一些NLP(文本处理技术)具体功能的Python实现。

    一:文本预处理

    1:英文版

    1. # 文本预处理
    2. # 导入所需的库
    3. import re
    4. from textblob import TextBlob
    5. from gensim.parsing.preprocessing import STOPWORDS
    6. from snowballstemmer import EnglishStemmer
    7. # 示例句子
    8. sentence = "The quick brown fox jumps over the lazy dog."
    9. # 分词 - 使用正则表达式
    10. tokens_re = re.findall(r'\b\w+\b', sentence.lower())
    11. # 分词 - 使用TextBlob
    12. blob = TextBlob(sentence)
    13. tokens_textblob = blob.words
    14. # 去除停用词 - 使用gensim的停用词列表
    15. filtered_tokens_gensim = [word for word in tokens_re if word not in STOPWORDS]
    16. # 词干提取 - 使用SnowballStemmer
    17. stemmer_snowball = EnglishStemmer()
    18. stemmed_tokens_snowball = [stemmer_snowball.stemWord(word) for word in filtered_tokens_gensim]
    19. tokens_re, tokens_textblob, filtered_tokens_gensim, stemmed_tokens_snowball

    这段代码的主要功能是对英文文本进行预处理,包括以下几个步骤:

    分词(Tokenization)

    使用正则表达式(re.findall)将句子分割成单词列表(tokens_re)。

    使用TextBlob库对句子进行分词,得到单词列表(tokens_textblob

    去除停用词(Stopwords Removal)

    利用gensim库提供的停用词列表,从正则表达式分词结果中移除停用词,得到过滤后的单词列表(filtered_tokens_gensim)。

    词干提取(Stemming)

    使用SnowballStemmer对过滤后的单词列表进行词干提取,即将单词还原到基本形式,得到词干化后的单词列表(stemmed_tokens_snowball)。

    以下是每个步骤的具体结果:

    • tokens_re:使用正则表达式分词后的单词列表。
    • tokens_textblob:使用TextBlob分词后的单词列表。
    • filtered_tokens_gensim:去除停用词后的单词列表。
    • stemmed_tokens_snowball:进行词干提取后的单词列表。

    这些预处理步骤有助于后续的自然语言处理任务,如文本分类、情感分析等,因为它们可以减少文本数据的噪声,提高模型处理的效率和质量。

    单词列表,过滤后的单词,词干提取后的结果分别为:

    2:中文版

    上述代码是用于英文文本预处理的,包括分词、去除停用词和词干提取。对于中文分词,这些步骤也是必要的,但需要使用支持中文的库和方法。以下是对中文文本进行类似处理的步骤:

    中文分词

    中文文本通常需要分词,因为中文词语之间没有明显的空格分隔。可以使用jieba等库进行中文分词。

    去除停用词

    中文也有停用词列表,可以从网上找到或使用相关库提供的停用词列表。

    词干提取

    中文的词干提取不同于英文,因为中文没有英文中的词形变化(如时态、复数等)。但可以进行词形还原,例如将“人们”还原为“人”。

    以下是使用jieba库对中文文本进行分词和去除停用词的示例代码:

    1. import jieba
    2. # 示例中文句子
    3. sentence = "小明的小狗应该是是已经送给小红了。"
    4. # 中文分词
    5. tokens_jieba = jieba.lcut(sentence)
    6. # 去除停用词(需要有一个中文停用词列表)
    7. stopwords = set(['的', '是', '了']) # 示例停用词列表
    8. filtered_tokens_jieba = [word for word in tokens_jieba if word not in stopwords]
    9. # 打印结果
    10. print("分词结果:", tokens_jieba)
    11. print("去除停用词后的结果:", filtered_tokens_jieba)

    结果如下:

    二:情感分析

    在Python中进行情感分析通常涉及以下步骤:

    1. 数据准备:收集并准备文本数据,可能包括清洗数据、去除停用词、标点符号等。

    2. 特征提取:将文本转换为机器学习模型可以处理的格式,通常包括词袋模型、TF-IDF或词嵌入。

    3. 模型选择:选择合适的机器学习算法或深度学习模型进行情感分析。常见的算法包括朴素贝叶斯、支持向量机、随机森林、逻辑回归等。对于深度学习方法,可以使用卷积神经网络(CNN)、循环神经网络(RNN)、长短期记忆网络(LSTM)或Transformer模型。

    4. 训练模型:使用标记好的情感数据训练模型。

    5. 评估模型:通过测试集评估模型的性能,使用准确率、召回率、F1分数等指标。

    6. 应用模型:将训练好的模型应用于新的数据进行情感分析。

    1:不需训练模型的情感分析

    (1)英文版

    以下是使用Python进行情感分析的一个简单示例,使用TextBlob库,它是一个简单的NLP库,提供了开箱即用的情感分析功能:

    1. # 情感分析
    2. from textblob import TextBlob
    3. # 示例文本
    4. text = "I love this product! It's absolutely fantastic."
    5. # 创建TextBlob对象
    6. blob = TextBlob(text)
    7. # 情感分析
    8. sentiment = blob.sentiment
    9. # polarity: 极性,范围从-1(非常负面)到1(非常正面)
    10. print(f"Polarity: {sentiment.polarity}")
    11. # subjectivity: 主观性,范围从0(非常客观)到1(非常主观)
    12. print(f"Subjectivity: {sentiment.subjectivity}")

    极性与主观性如下:

    (2)中文版

    要进行中文情感分析,我们可以使用Python的文本分析库,如SnowNLP。这个库对中文文本进行处理时,可以较好地识别情感倾向。我们将使用SnowNLP库来分析一个中文句子,并输出其情感评分。情感评分越接近1,表示情感越正面;越接近0,表示情感越负面。下面举一个具体实例:

    1. from snownlp import SnowNLP
    2. def analyze_sentiment_chinese(text):
    3. s = SnowNLP(text)
    4. sentiment_score = s.sentiments
    5. if sentiment_score > 0.5:
    6. return "positive"
    7. elif sentiment_score < 0.5:
    8. return "negative"
    9. else:
    10. return "neutral"
    11. text = "这个产品非常好用,我很满意。"
    12. sentiment = analyze_sentiment_chinese(text)
    13. print(f"The sentiment of the text is: {sentiment}")

    2:需要训练模型的情感分析

    对于更复杂的情感分析任务,可能需要使用scikit-learnTensorFlowPyTorch等库来构建和训练更复杂的模型。以下是一个使用scikit-learn的朴素贝叶斯分类器进行情感分析的简单示例:

    1. from sklearn.feature_extraction.text import CountVectorizer
    2. from sklearn.model_selection import train_test_split
    3. from sklearn.naive_bayes import MultinomialNB
    4. from sklearn import metrics
    5. # 假设我们有一些标记好的情感数据
    6. data = ["I love this product", "I hate this product", "This is the best purchase I've made", "I'm disappointed with this product"]
    7. labels = [1, 0, 1, 0] # 1 表示正面,0 表示负面
    8. # 特征提取
    9. vectorizer = CountVectorizer()
    10. X = vectorizer.fit_transform(data)
    11. # 划分训练集和测试集
    12. X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.25, random_state=42)
    13. # 使用朴素贝叶斯分类器
    14. model = MultinomialNB()
    15. model.fit(X_train, y_train)
    16. # 预测
    17. predictions = model.predict(X_test)
    18. # 评估
    19. print(metrics.accuracy_score(y_test, predictions))

    由于提供的训练数据较少,所以评估模型的质量可能不会达到理想水平。
     

    三:主题建模

    主题建模是一种用于发现文本数据中隐藏主题的统计模型。一个常见的案例是使用LDA(Latent Dirichlet Allocation)模型对新闻文章或社交媒体帖子进行主题分析。以下是实现主题建模的一般步骤:

    1. 数据收集:收集用于分析的文本数据,例如新闻文章或社交媒体帖子。
    2. 文本预处理:包括分词、去除停用词、词干提取或词形还原等步骤。
    3. 构建词袋模型:将文本数据转换为词袋模型,这是一种表示文本中单词出现频率的数学模型。
    4. 应用LDA模型:使用LDA模型对词袋模型进行分析,以发现文本中的主题。
    5. 解释和评估结果:分析LDA模型输出的主题,并评估其质量。

    为了演示,我将使用一个简化的示例,其中包含一些假想的新闻文章标题,并应用LDA模型来识别潜在的主题。

    1:英文版

    1. from sklearn.decomposition import LatentDirichletAllocation
    2. from sklearn.feature_extraction.text import CountVectorizer
    3. # 示例数据:一些假想的新闻文章标题
    4. documents = [
    5. "Local Government Increases Taxes",
    6. "Sports Team Wins Championship",
    7. "New Medical Breakthrough Announced",
    8. "Economic Growth Slows Down",
    9. "Celebrity Divorce Shocks Fans",
    10. "Tech Company Launches New Product",
    11. "Environmental Protest Draws Thousands",
    12. "Ancient Artifact Discovered"
    13. ]
    14. # 文本预处理:分词和构建词袋模型
    15. vectorizer = CountVectorizer(stop_words='english')
    16. dtm = vectorizer.fit_transform(documents)
    17. # 应用LDA模型
    18. lda_model = LatentDirichletAllocation(n_components=3, random_state=42)
    19. lda_dtm = lda_model.fit_transform(dtm)
    20. # 获取主题关键词
    21. def get_topics_terms(lda_model, vectorizer, n_terms):
    22. terms = vectorizer.get_feature_names_out()
    23. topics = []
    24. for topic_idx, topic in enumerate(lda_model.components_):
    25. top_features_ind = topic.argsort()[:-n_terms - 1:-1]
    26. top_features = [terms[i] for i in top_features_ind]
    27. topics.append(top_features)
    28. return topics
    29. topics = get_topics_terms(lda_model, vectorizer, 5)
    30. topics

    结果如下:

    我已经使用LDA模型对一组假想的新闻文章标题进行了主题建模。以下是识别出的三个主题及其相关关键词:

    1. 主题1:与科技和体育相关的词汇,如“tech”, “product”, “launches”, “company”, “sports”。
    2. 主题2:与政府和税收相关的词汇,如“new”, “increases”, “government”, “taxes”, “local”。
    3. 主题3:与环境和社会运动相关的词汇,如“thousands”, “protest”, “environmental”, “draws”, “slows”。

    这个简化的例子展示了如何使用LDA模型从文本数据中提取主题。

    2:中文版

    LDA主题建模同样可以应用于中文文本数据。但是,处理中文文本时需要特别注意以下几点:

    1. 分词:中文文本不像英文那样自然分隔,因此需要使用分词工具(如jieba分词)来正确地将文本分割成单词。
    2. 停用词:中文有自己的一套常见词和停用词,需要使用专门的中文停用词表。
    3. 词性标注和筛选:在某些情况下,可能需要根据词性(如名词、动词)来筛选单词,以改善主题建模的结果。

    为了演示如何在中文文本上应用LDA主题建模,我将使用一个简化的中文文本数据集,并应用jieba分词和LDA模型来识别潜在的主题。

    1. import jieba
    2. # 示例中文数据:一些假想的新闻文章标题
    3. chinese_documents = [
    4. "中国政府增加税收",
    5. "体育队赢得冠军",
    6. "新的医学突破宣布",
    7. "经济增长放缓",
    8. "名人离婚震惊粉丝",
    9. "科技公司推出新产品",
    10. "环保抗议吸引数千人",
    11. "古代文物被发现"
    12. ]
    13. # 中文文本预处理:分词
    14. segmented_docs = [" ".join(jieba.cut(doc)) for doc in chinese_documents]
    15. # 使用CountVectorizer构建词袋模型
    16. chinese_vectorizer = CountVectorizer()
    17. chinese_dtm = chinese_vectorizer.fit_transform(segmented_docs)
    18. # 应用LDA模型
    19. chinese_lda_model = LatentDirichletAllocation(n_components=3, random_state=42)
    20. chinese_lda_dtm = chinese_lda_model.fit_transform(chinese_dtm)
    21. # 获取中文主题关键词
    22. chinese_topics = get_topics_terms(chinese_lda_model, chinese_vectorizer, 5)
    23. chinese_topics

    结果如下:

    我已经使用LDA模型对一组假想的中文新闻文章标题进行了主题建模。以下是识别出的三个主题及其相关关键词:

    1. 主题1:与体育和经济相关的词汇,如“冠军”, “体育”, “赢得”, “增长”, “放缓”。
    2. 主题2:与名人和文化相关的词汇,如“震惊”, “离婚”, “粉丝”, “名人”, “文物”。
    3. 主题3:与科技和社会运动相关的词汇,如“科技”, “产品”, “推出”, “公司”, “抗议”。

    这个例子展示了如何使用LDA模型从中文文本数据中提取主题。在实际应用中,中文文本的处理可能更加复杂,需要考虑更多的语言特性和上下文信息。

    四:每日股票行情数据

    想要探索多元化的数据分析视角,可以关注之前发布的相关内容。

  • 相关阅读:
    Dynamsoft Barcode Reader C, C++, .NET, Java SDK
    地区新闻查询易语言代码
    高新技术企业的10个涉税问题提醒
    第七章-项目成本管理
    CountDownLatch
    JS中的【函数】与【方法】之“父慈子孝”
    Spring Authorization Server 系列(二)获取授权码
    Markdown基本语法
    【MindSpore易点通】如何保存模型进行checkpoint对比以及Print算子使用说明
    [OC学习笔记]多线程之GCD
  • 原文地址:https://blog.csdn.net/2301_80651329/article/details/142151082