作者|Abhijit Gupta 编译|VK 来源|Towards Data Science
介绍
自然语言处理(NLP)是一个令人生畏的领域名称。从非结构化文本中生成有用的结论是很困难的,而且有无数的技术和算法,每一种都有自己的用例和复杂性。作为一个接触NLP最少的开发人员,很难知道要使用哪些方法以及如何实现它们。
如果我以最小的努力提供尽量完美的结果。使用80/20原则,我将向你展示如何在不显著牺牲结果(80%)的情况下快速(20%)交付解决方案。
“80/20原则认为,少数的原因、投入或努力通常导致大多数结果、产出或回报”
-理查德·科赫,80/20原则的作者
我们将如何实现这一目标?有一些很棒的Python库!我们可能站在巨人的肩膀上,迅速创新,而不是重新发明轮子。通过预先测试的实现和预训练的模型,我们将专注于应用这些方法并创造价值。
本文的目标读者是希望将自然语言处理快速集成到他们的项目中的开发人员。在强调易用性和快速效果的同时,性能也会下降。根据我的经验,80%的技术对于项目来说是足够的,但是也可以从其他地方寻找相关方法
不用多说了,我们开始吧!
什么是NLP?
自然语言处理是语言学、计算机科学和人工智能的一个分支领域,允许通过软件自动处理文本。NLP使机器能够阅读、理解和响应杂乱无章的非结构化文本。
人们通常将NLP视为机器学习的一个子集,但实际情况更为微妙。
有些NLP工具依赖于机器学习,有些甚至使用深度学习。然而,这些方法往往依赖于大数据集,并且难以实现。相反,我们将专注于更简单、基于规则的方法来加快开发周期。
术语
从最小的数据单位开始,字符是单个字母、数字或标点符号。一个单词是一个字符列表,一个句子是一个单词列表。文档是句子的列表,而语料库是文档的列表。
预处理
预处理可能是NLP项目中最重要的一步,它涉及到清理输入,这样模型就可以忽略噪声,并将注意力集中在最重要的内容上。一个强大的预处理管道将提高所有模型的性能,所以必须强调它的价值。
以下是一些常见的预处理步骤:
- 分段:给定一长串字符,我们可以用空格分隔文档,按句点分隔句子,按空格分隔单词。实现细节将因数据集而异。
- 使用小写:大写通常不会增加性能,并且会使字符串比较更加困难。所以把所有的东西都改成小写。
- 删除标点:我们可能需要删除逗号、引号和其他不增加意义的标点。
- 删除停用词:停用词是像“she”、“the”和“of”这样的词,它们不会增加文本的含义,并且分散对关键字的注意力。
- 删除其他不相关单词:根据你的应用程序,你可能希望删除某些不相关的单词。例如,如果评估课程回顾,像“教授”和“课程”这样的词可能没有用。
- 词干/词根化:词干分析和词根化都会生成词形变化单词的词根形式(例如:“running”到“run”)。词干提取速度更快,但不能保证词根是英语单词。词根化使用语料库来确保词根是一个单词,但代价是速度。
- 词性标注:词性标注以词性(名词、动词、介词)为依据,根据词义和语境来标记单词。例如,我们可以专注于名词进行关键字提取。
有关这些概念的更全面的介绍,请查看以下指南:
这些步骤是成功的预处理的基础。根据数据集和任务的不同,你可以跳过某些步骤或添加新步骤。通过预处理手动观察数据,并在出现问题时进行更正。
Python库
让我们来看看NLP的两个主要Python库。这些工具将在预处理期间,占据非常大的作用
NLTK
自然语言工具包是Python中使用最广泛的NLP库。NLTK是UPenn为学术目的而开发的,它有大量的特征和语料库。NLTK非常适合处理数据和运行预处理:https://www.nltk.org/
NLTK是构建Python程序以处理人类语言数据的领先平台。它提供了易于使用的API
>>> import nltk
>>> sentence = "At eight o'clock on Thursday morning Arthur didn't feel very good."
>>> tokens = nltk.word_tokenize(sentence)
>>> tokens
['At', 'eight', "