自然语言处理 - 使用文本数据的机器学习

发布日期:2026-07-19 09:25:06   来源 : 杭州电子商务研究院    浏览量 :0
杭州电子商务研究院 发布日期:2026-07-19 09:25:06  
0

介绍

自然语言处理 (NLP) 无处不在,具有多种应用。一些示例包括将电子邮件分类为垃圾邮件和普通邮件、聊天机器人、AI 代理、社交媒体分析以及将客户或员工反馈分类为正面、负面或中立。

在本指南中,我们将讨论 NLP 的一个极为流行的用例 - 在文本数据上构建监督机器学习模型。

我们已经在之前的指南“[Scikit 机器学习]”(/guides/scikit-machine-learning) 中讨论过监督机器学习。然而,文本分类与涉及结构化表格数据的其他方法之间的区别在于,在前者中,我们经常从原始文本中生成特征。

问题陈述

在本指南中,我们将着手实现医学领域评论的自动化。医学文献数量庞大且变化迅速,增加了评论的需求。通常,此类评论都是手动完成的,既繁琐又耗时。我们将尝试通过构建一个文本分类模型来解决这个问题,该模型将使该过程自动化。

我们将使用的数据集nlpdata2.csv来自Pubmed搜索,包含 1748 个观测值和 3 个变量,如下所述:

  • 标题 - 由检索到的论文标题组成

  • 摘要 - 包括检索到的论文摘要

  • 试验 - 变量表明该论文是否是测试癌症药物治疗的临床试验。

  • class - 类似于变量“trial”,表示该论文是否为临床试验(是)或不是(否)。这是目标变量,已添加到原始数据中。

步骤

以下是我们将在本指南中遵循的步骤。

*步骤 1——加载所需的库和模块。*

*第 2 步 - 加载数据并执行基本数据检查。*

*步骤 3 - 预处理原始文本并为机器学习做好准备。*

*步骤 4 - 创建训练和测试数据集。*

*步骤 5-使用 TfidfVectorizer 将文本转换为词频向量。*

*第 6 步 - 创建并调整分类器。*

*步骤 7——计算评估指标。*

以下部分将介绍这些步骤。

步骤 1 - 加载所需的库和模块

      # Import required libraries
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.utils import shuffle

%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
    

第 2 步 - 加载数据并执行基本数据检查

第一行代码将数据读入为 pandas 数据框,而第二行打印形状 - 4 个变量的 1,748 个观测值。第三行打印前五个观测值。

      df = pd.read_csv('nlpdata2.csv')
print(df.shape)
df.head()
    

输出:

(1748, 4)

标题 抽象的 审判 班级
0 四环素与甲基强的松龙在……中的比较 0.5 毫克四氢叶酸被认为是等效的...... 0
1 循环联合化疗治疗转移性... 104 名非随机分组的患有代谢综合征的患者…… 1 是的
2 降低骨转移的发病率…… 131 名患有骨质转移瘤的患者... 0
3 短期和持续化疗的比较... 132例晚期复发性乳腺癌患者... 1 是的
4 一项随机 III 期交叉研究...... 139 名患有晚期...的围绝经期和绝经后妇女 1 是的

加载数据后,我们将进行基本的数据探索。让我们检查目标类的分布,这可以使用条形图来完成。下面的第一行代码通过计算“类”变量的出现次数来对其进行分组。第二行显示条形图。

很明显,目标变量中“否”的出现次数比“是”多。不过,好消息是差异并不大,数据相对平衡。

第三行代码计算了基线准确率,结果为 56%。计算方法是将目标变量中出现的多数类别(即“否”)的次数除以总观察次数。

基线准确度很重要,但在机器学习中却经常被忽视。它为模型应达到的最低准确度设定了基准。

      df.groupby('class').abstract.count().plot.bar(ylim=0)
plt.show()
print(971/1748) #Baseline accuracy
    

输出:

输出:

0.5554919908466819 #基线准确率

步骤 3 - 预处理原始文本并为机器学习做好准备

现在,我们准备构建文本分类器。然而,这正是 NLP 中事情开始变得棘手的地方。我们拥有的数据是原始文本,本身不能用作特征。因此,我们必须对文本进行预处理。

常见的预处理步骤有:

删除标点符号 - 经验法则是删除所有不属于 x,y,z 形式的符号。

删除停用词 - 这些是无用的词,例如“the”、“is”、“at”。这些词没有用,因为这些停用词在语料库中出现的频率很高,但它们无助于区分目标类别。删除停用词也会减少数据量。

转换为小写 - 像“Clinical”和“clinical”这样的词需要被视为一个词。因此,这些词被转换为小写。

词干提取 - 词干提取的目的是减少文本中出现的单词的屈折形式数量。这会导致诸如“argue”、“argued”、“arguing”、“argues”等单词被简化为它们的通用词干“argu”。这有助于减少词汇空间的大小。有很多方法可以执行词干提取,其中最流行的是 Martin Porter 的“Porter Stemmer”方法。

为了完成上述步骤,我们必须加载 nltk 包,这在下面的第一行代码中完成。第二行下载 nltk 包中的“停用词”列表。

      import nltk
nltk.download('stopwords')
    

输出:

[nltk_data] 正在将软件包停用词下载至 /home/boss/nltk_data... [nltk_data] 正在解压 corpora/stopwords.zip。True

nltk 包已加载并准备使用后,我们将执行预处理任务。下面的前两行代码分别导入停用词和 PorterStemmer 模块。

第三行导入正则表达式库“re”,这是一个功能强大的文本解析 Python 包。要了解有关文本解析和“re”库的更多信息,请参阅指南“[自然语言处理 - 文本解析]”(/guides/text-parsing)。

第四到第六行代码进行上面讨论的文本预处理。

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

stemmer = PorterStemmer()
words = stopwords.words("english")

df['processedtext'] = df['abstract'].apply(lambda x: " ".join([stemmer.stem(i) for i in re.sub("[^a-zA-Z]", " ", x).split() if i not in words]).lower())
    

我们现在将看一下具有新列“processedtext”的预处理数据集。

      print(df.shape)
df.head(10)
    

输出:

(1748, 5)

标题 抽象的 审判 班级 已处理文本
0 四环素与甲基强的松龙在……中的比较 0.5 毫克四氢叶酸被认为是等效的...... 0 毫克四氢叶酸相当于毫克甲基泼尼松龙……
1 循环联合化疗治疗转移性... 104 名非随机分组的患有代谢综合征的患者…… 1 是的 非随机患者患有转移性乳腺癌……
2 降低骨转移的发病率…… 131 名患有骨质转移瘤的患者... 0 患者骨质转移性乳腺癌随机...
3 短期和持续化疗的比较... 132例晚期复发性乳腺癌患者... 1 是的 患者晚期复发性乳腺癌治疗四种...
4 一项随机 III 期交叉研究...... 139 名患有晚期...的围绝经期和绝经后妇女 1 是的 围绝经期妇女晚期复发性乳腺癌...
5 17ss-羟基类固醇脱氢酶 1 型作为... 17ss-羟基类固醇脱氢酶 (17HSDs) 是... 0 ss 羟基类固醇脱氢酶 hsd 涉及局部……
6 长春地辛-米托蒽醌 (VM) 与长春地辛-4... 182 名转移性乳腺癌患者…… 1 是的 患者转移性乳腺癌随机 v mg v m...
7 L-天冬酰胺酶 (NSC 109229) 的第一阶段研究。 22 名患者接受静脉注射 La... 0 患者接受静脉输注天冬酰胺...
8 乳腺癌的辅助化疗治疗 248 名接受局部根治治疗的癌症患者...... 1 是的 患者局部根治治疗早期乳腺癌...
9 头皮冷却对于预防没有任何作用...... 对 35 名患者进行了研究,以确定其有效性…… 0 患者研究确定头皮低温效果...
<
以上内容来自杭州电子商务研究院推送
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据