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

ops/2024/9/24 19:14:35/

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

一:文本预处理

1:英文版

# 文本预处理
# 导入所需的库
import re
from textblob import TextBlob
from gensim.parsing.preprocessing import STOPWORDS
from snowballstemmer import EnglishStemmer# 示例句子
sentence = "The quick brown fox jumps over the lazy dog."# 分词 - 使用正则表达式
tokens_re = re.findall(r'\b\w+\b', sentence.lower())# 分词 - 使用TextBlob
blob = TextBlob(sentence)
tokens_textblob = blob.words# 去除停用词 - 使用gensim的停用词列表
filtered_tokens_gensim = [word for word in tokens_re if word not in STOPWORDS]# 词干提取 - 使用SnowballStemmer
stemmer_snowball = EnglishStemmer()
stemmed_tokens_snowball = [stemmer_snowball.stemWord(word) for word in filtered_tokens_gensim]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库对中文文本进行分词和去除停用词的示例代码:

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

结果如下:

二:情感分析

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

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

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

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

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

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

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

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

(1)英文版

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

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

极性与主观性如下:

(2)中文版

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

from snownlp import SnowNLPdef analyze_sentiment_chinese(text):s = SnowNLP(text)sentiment_score = s.sentimentsif sentiment_score > 0.5:return "positive"elif sentiment_score < 0.5:return "negative"else:return "neutral"text = "这个产品非常好用,我很满意。"
sentiment = analyze_sentiment_chinese(text)
print(f"The sentiment of the text is: {sentiment}")

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

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

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

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

三:主题建模

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

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

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

1:英文版

from sklearn.decomposition import LatentDirichletAllocation
from sklearn.feature_extraction.text import CountVectorizer# 示例数据:一些假想的新闻文章标题
documents = ["Local Government Increases Taxes","Sports Team Wins Championship","New Medical Breakthrough Announced","Economic Growth Slows Down","Celebrity Divorce Shocks Fans","Tech Company Launches New Product","Environmental Protest Draws Thousands","Ancient Artifact Discovered"
]# 文本预处理:分词和构建词袋模型
vectorizer = CountVectorizer(stop_words='english')
dtm = vectorizer.fit_transform(documents)# 应用LDA模型
lda_model = LatentDirichletAllocation(n_components=3, random_state=42)
lda_dtm = lda_model.fit_transform(dtm)# 获取主题关键词
def get_topics_terms(lda_model, vectorizer, n_terms):terms = vectorizer.get_feature_names_out()topics = []for topic_idx, topic in enumerate(lda_model.components_):top_features_ind = topic.argsort()[:-n_terms - 1:-1]top_features = [terms[i] for i in top_features_ind]topics.append(top_features)return topicstopics = get_topics_terms(lda_model, vectorizer, 5)
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模型来识别潜在的主题。

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

结果如下:

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

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

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

四:每日股票行情数据

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


http://www.ppmy.cn/ops/111835.html

相关文章

代码随想录训练营day46|647. 回文子串,516.最长回文子序列

647. 回文子串 一开始我想的dp[i]表示到i为止有多少回文子串&#xff0c;但返现这样推到不出任何dp之间的关系。 而如果把dp[i][j]定义为i到j之间是否是回文子串的话。 则dp[i][j]和dp[i1][j-1]是有关系的。 if(s[i]s[j]&&j-i>0){if(j-i<1){dp[i][j]true;}else…

NoSQL之 Redis配置与优化

关系数据库与非关系型数据库 ●关系型数据库&#xff1a; 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。 SQL 语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库…

后端开发刷题 | 兑换零钱(动态规划)

描述 给定数组arr&#xff0c;arr中所有的值都为正整数且不重复。每个值代表一种面值的货币&#xff0c;每种面值的货币可以使用任意张&#xff0c;再给定一个aim&#xff0c;代表要找的钱数&#xff0c;求组成aim的最少货币数。 如果无解&#xff0c;请返回-1. 数据范围&am…

189. 轮转数组

思路 看 k%len(nums)情况 k%len(nums)0&#xff1a;翻转后还是原列表&#xff0c;那就不需要翻转 k%len(nums)>len(nums)//2,显然从后往前翻转过慢&#xff0c;不如从前往后翻转&#xff08;次数更少&#xff09; k%len(nums)<len(nums)//2,显然从后往前翻转次数更少…

修改docker的默认存储位置及镜像存储位置

前言 Docker 默认安装的情况下&#xff0c;会使用 /var/lib/docker/ 目录作为存储目录&#xff0c;用以存放拉取的镜像和创建的容器等。 不过由于此目录一般都位于系统盘&#xff0c;遇到系统盘比较小&#xff0c;而镜像和容器多了后就容易出问题&#xff0c;这里说明一下如何修…

js TypeError: Cannot read property ‘initialize’ of undefined

js TypeError: Cannot read property ‘initialize’ of undefined 在JavaScript开发旅程中&#xff0c;遇到TypeError: Cannot read property ‘initialize’ of undefined这样的错误提示&#xff0c;无疑是令人沮丧的。这个错误通常意味着你试图访问一个未定义对象的initiali…

Python 正则表达式详解:从基础匹配到高级应用

Python 正则表达式详解&#xff1a;从基础匹配到高级应用 文章目录 Python 正则表达式详解&#xff1a;从基础匹配到高级应用一 功能总览二 不用正则的判断三 使用正则判断1 验证用户邮箱2 正则返回匹配信息 四 多条件匹配五 按类型匹配六 匹配中文七 查找替换等功能八 在模式中…

研1日记13

正态分布&#xff1a; toTenor&#xff1a;转数字变为0-1 加载模型&#xff1a; model youmodel() model.load("路径") 测试单个样本&#xff1a;