自然语言处理(文本预处理基础)
目录
1.实验要求
2.实验步骤
(1). 创建中文数据集
(2).文本预处理
(3).句法结构分析
(4).绘制句法树
(5).句法树生成
3.代码及分析
1.实验要求
2.实验步骤
(1). 创建数据集
(2).文本预处理
(3).使用Tfidf模型进行文本特征提取
(4).划分训练集和测试集
(5).使用Logistic Regression进行文本分类
(6).预测测试集
3.代码及解析
4.补充函数知识
re.sub()
正则表达式
TfidfVectorizer()参数及用法
fit_transform()解释
train_test_split()函数
LogisticRegression()
fit()
predict()
1.实验要求
2.实验步骤
(1).创建中文数据集
(2).定义命名实体识别函数
(3).对每个句子进行命名实体识别。
3.代码及解析
1.实验要求
中文文本的预处理,进行句法结构分析,生成句法树并输出。
2.实验步骤
(1). 创建中文数据集
引入中文分词库和nltk库,定义data,输入一些中文句子。
(2).文本预处理
定义一个文本预处理函数,定义停用词,将传入函数的句子进行分词,返回为列表类型,返回words中,不在停用词范围内的词。
(3).句法结构分析
句法结构分析,生成句法树。定义一个函数,根据创建的中文集,对句法树进行分层,定义3种数结构,判断条件分别为句子中是否含有,”喜欢”、”去了”、”适合”三个词
(4).绘制句法树
循环将句子传入自定义的绘制句法树函数中,在绘制句法树中调用生成句法树函数,最后使用pretty_print函数,以美观的格式打印复杂的数据结构,如嵌套的字典、列表等。
(5).句法树生成
循环调用绘制句法树函数,以达到句法树生成的目的。
3.代码及分析
import jieba
from nltk import Tree
# 创建中文数据集
data = ["我喜欢学习自然语言处理。", "她今天早上去了公园。", "天气很晴朗,适合户外活动。"]
# 文本预处理
def preprocess_text(text):
stop_words = ['的', '了', '在', '是'] # 停用词
words = jieba.lcut(text) #将文本切分成词语,返回列表类型
return [word for word in words if word not in stop_words]
preprocessed_data = [preprocess_text(sentence) for sentence in data] #preprocess_text()函数主要用于文本预处理,包括将文本转换为小写、分词和去除停用词等操作。
# 句法结构分析 (生成句法树)
def generate_syntax_tree(sentence):
if "喜欢" in sentence:
return Tree('S', [
Tree('NP', ['我']),
Tree('VP', ['喜欢',
Tree('NP', ['学习', '自然语言处理'])])
])
elif "去了" in sentence:
return Tree('S', [
Tree('NP', ['她']),
Tree('VP', [
'去了',
Tree('NP', ['公园'])
])
])
elif "适合" in sentence:
return Tree('S', [
Tree('NP', ['天气']),
Tree('VP', [
'适合',
Tree('NP', ['户外活动'])
])
])
return Tree('S', [Tree('NP', ['未识别句子'])])
# 绘制句法树
def draw_syntax_tree(sentence):
tree = generate_syntax_tree(sentence)
tree.pretty_print() #以美观的格式打印复杂的数据结构,如嵌套的字典、列表等。
# 句法树生成
for sentence in preprocessed_data:
draw_syntax_tree(sentence)
1.实验要求
文本特征提取并进行文本分类。
2.实验步骤
(1). 创建数据集
创建中文文本数据集,数据集中包含测试集和训练集,并给每个中文文本的情感贴上标签,1代表积极的情绪,0代表消极的情绪。
(2).文本预处理
对文本进行预处理,先对文本进行分词操作,在定义一个停用词列表,将句子中的干扰项去掉,包括一些连词和特殊符号,对文本进行优化,将优化好的文本连接起来,作为一个字符串返回。
(3).使用Tfidf模型进行文本特征提取
Tfidf对文本进行特征提取,用到参数:ngram_range参数指的是词组长度范围,即指定生成词组的起始和结束长度。min_df参数用于筛选文本特征,其值表示一个词项在多少个文档中出现,才会被保留。max_df表示最大文档频率,超过频率得此会被去除。
fit_transform:对文本进行向量化处理。
(4).划分训练集和测试集
train_test_split函数实现对数据集的划分,使用参数:X是特征集,labels是目标变量。train_test_split()函数根据指定的test_size参数将数据集划分为训练集和测试集。random_state参数用于设置随机种子,以确保每次运行代码时划分结果相同。
(5).使用Logistic Regression进行文本分类
在LogisticRegression回归函数中定义参数:max_iter算法收敛最大迭代次数,告诉模型在寻找损失函数最小值时最多进行多少次迭代。再使用fit函数,将数据输入到模型中,通过调整模型参数来优化模型性能。
(6).预测测试集
使用predict函数对测试集中的样本点数据进行预测,配合fit函数使用。最后将结果输出。
3.代码及解析
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import jieba
import random
import re
# 创建数据集(包括训练集和测试集)
texts = ["今天天气很好", "我很开心", "我很喜欢这部电影", "这个项目很难", "我不喜欢这个天气", "这个地方非常美丽",
"我觉得这道题很简单", "这个决定让我很开心", "我对这个结果很失望", "今天的饭很好吃",
"我再也不玩抽象了", "洗好的衣服很香", "我讨厌那个人", " fool%#_ Fool "]
labels = [1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0] # 1表示积极,0表示消极
# 文本预处理函数
def preprocess_text(text):
stop_words = ["这个", "我", "的", "很", "那个", "这部", "再也"]
words = jieba.cut(text) #分词
words = [word for word in words if word not in stop_words] #循环对比每一个词是不是停用词,去掉停用词
#print(words) #去掉注释查看输出结果
words = [re.sub(r'[^\w\s]', '', word) for word in words if word.strip()] #在word中除空白字符和单词字(单词字符中,包含下划线)符外的所有字符都用NULL替代,strip():用来删去字符串头尾指定的字符,默认删去空白和换行符
#print(words)
return ' '.join(words) #将words拼成一个新的字符串,并返回字符传(String),而不是字符类型(Char)
# 对所有文本进行预处理,句子循环传入文本预处理函数中
processed_texts = [preprocess_text(text) for text in texts]
# 使用Tfidf模型进行文本特征提取
vectorizer = TfidfVectorizer(ngram_range=(1, 3), min_df=1, max_df=0.9) #ngram_range参数指的是词组长度范围,即指定生成词组的起始和结束长度。min_df参数用于筛选文本特征,其值表示一个词项在多少个文档中出现,才会被保留。max_df表示最大文档频率,超过频率得此会被去除。
X = vectorizer.fit_transform(processed_texts) #将文本进行向量化处理
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.3, random_state=42) #X是特征集,labels是目标变量。train_test_split()函数根据指定的test_size参数将数据集划分为训练集和测试集。random_state参数用于设置随机种子,以确保每次运行代码时划分结果相同。
# 使用Logistic Regression进行文本分类
clf = LogisticRegression(max_iter=200) #算法收敛最大迭代次数,int类型,默认为10,这个参数的作用是告诉模型在寻找损失函数最小值时最多进行多少次迭代。
clf.fit(X_train, y_train) #X_train是训练集的输入特征,y_train是对应的目标值。
# 预测测试集
predictions = clf.predict(X_test) #predict函数就是对测试集中的样本点数据进行预测,配合fit函数使用
print(f"测试集预测结果: {predictions}")
print(f"实际标签: {y_test}")
4.补充函数知识
re.sub()
re.sub函数用于在字符串中替换匹配的文本。
基本语法如下:
re.sub(pattern, repl, string, count=0, flags=0)
其中,pattern是要匹配的正则表达式模式,repl是替换的字符串,string是要处理的字符串,count是替换的最大次数(默认为0,表示所有匹配的地方都替换),flags是匹配模式。
正则表达式
正则匹配之正则匹配全部汇总:_正则匹配所有字符-CSDN博客
TfidfVectorizer()参数及用法
Python中的TfidfVectorizer参数使用解析_python_脚本之家
fit_transform()解释
estimateRigidTransform参数 fit_transform参数_mob6454cc7aaa9d的技术博客_51CTO博客
讲清楚fit_transform()和transform()的区别及说明_python_脚本之家
train_test_split()函数
https://zhuanlan.zhihu.com/p/698173246
python机器学习 train_test_split()函数用法解析及示例|野牛程序员
LogisticRegression()
逻辑回归函数讲解
https://zhuanlan.zhihu.com/p/631269356
逻辑回归函数参数说明
LogisticRegression - 参数说明_logisticregression()参数-CSDN博客
fit()
在深度学习和机器学习领域,fit函数是训练模型过程中不可或缺的一环。它用于将数据输入到模型中,通过调整模型参数来优化模型性能。
参数详解
- 学习率(learning_rate):优化器在更新参数时使用的步长。较小的学习率可能导致训练时间较长,而较大的学习率可能导致模型不稳定。
- 优化器(optimizer):用于更新模型参数的算法,如Adam、SGD等。
- 损失函数(loss):用于衡量预测值与真实值之间差异的函数,如均方误差(MSE)、交叉熵等。
- 指标(metrics):用于评估模型性能的指标,如准确率、召回率等。
在PyTorch中自定义fit()函数中的操作代码_python_脚本之家
Python model.fit() fit函数参数-CSDN博客
predict()
https://www.baidu.com/link?url=GsfdNhpxrhPqTqibJUr--H3X4Ql1jzE_xAey_7MlnsLQJWejw635Mz_UVCGHSN59aNVRq_jhkDYFLtUzzHNU-te8QxDcL2nkatjm70huBra&wd=&eqid=c3ed0d81000119bb00000003671cc9c3
参数
Python中predict函数参数:如何使用Python的predict函数进行机器学习预测-百度开发者中心
1.实验要求
实现命名实体识别的基本操作与功能。
2.实验步骤
(1).创建中文数据集
创建中文数据集,将已知的地名和组织名分别放入两个列表konw_locations和know_organizations中。
(2).定义命名实体识别函数
函数识别规则为:首先,对输入的句子进行分词,将分好的词组放入列表中,对比分好的词,是否与自定义列表中的词相同,相同就将其加入对应的列表分类中,不相同就将其放入剩下的一个列表中。
(3).对每个句子进行命名实体识别。
定义需要进行识别的句子,循环依次读取一个句子,并将句子传入自定义的命名尸体识别函数中,循环将识别结果进行输出,得到结果。
3.代码及解析
import jieba
import re
# 已知的地名和组织名列表
known_locations = {"上海", "哈尔滨", "哈尔滨工业大学", "海里"}
known_organizations = {"字节跳动", "第五人格"}
# 命名实体识别函数
def named_entity_recognition(text):
entities = {'人名': [], '地名': [], '组织名': []}
words = jieba.lcut(text) #将中文文本切分成词语,返回列表类型
for known_entity in known_locations | known_organizations: # 使用集合的并集操作
if known_entity in text: #判断词语是否在定义的列表中
if known_entity in known_locations:
entities['地名'].append(known_entity)
elif known_entity in known_organizations:
entities['组织名'].append(known_entity)
person_pattern = re.compile(r'[\u4e00-\u9fa5]{2,3}') #compile用于编译正则表达式,[\u4e00-\u9fa5]专门用于匹配简体中文的正则表达式,实际上繁体字也在里面
for word in words:
if person_pattern.match(word): #字符串匹配
if word not in known_locations and word not in known_organizations:
entities['人名'].append(word)
return entities
# 对每个句子进行命名实体识别
data = [
"晶晶是哈尔滨工业大学的学生。",
"西西在上海工作。",
"小三和小四一起去了海里游泳。",
"字节跳动是一家著名的科技公司。",
"这五部电影不容错过",
"第五人格真是太好玩了",
]
for sentence in data:
entities = named_entity_recognition(sentence)
print(f"句子: {sentence}")
print(f"识别到的命名实体: {entities}")