自然语言处理 - 使用文本数据的机器学习
介绍
自然语言处理 (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 | 不 | 患者研究确定头皮低温效果... |
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~