什么是自然语言处理 (NLP)?
自然语言处理 (NLP) 是人工智能 (AI) 的一个子领域,它使用自然语言处理人与计算机之间的交互。NLP 关注开发算法和计算模型,使计算机能够理解、分析和生成人类语言。
NLP 是不同领域的交集
NLP 是一个多学科领域,它借鉴了计算机科学、语言学、数学和心理学的技术。它的目标是构建能够处理和理解人类语言的系统,人类语言是一种复杂而微妙的交流形式,涉及许多层次的含义。
使用 Python 的 NLP
如前所述,NLP 是 AI 的一个分支,涉及分析人类生成的语言数据,包括文本和语音。在行业专业人士中,Python 因其众多优势而成为处理文本数据的首选。
Python 既易于阅读,又类似于伪代码,因此易于生成和测试代码。此外,它还具有高度的抽象性,这有利于 NLP 系统的开发。Python 的简单性使用户能够专注于 NLP 而不是编程语言细节,而它的效率使 NLP 应用程序原型的快速创建成为可能。
Python 的受欢迎程度和强大的社区支持使其成为开发 NLP 系统的绝佳选择。此外,Python 中提供了许多开源 NLP 库,以及提供 Python API 的机器学习库,如 PyTorch、TensorFlow 和 Apache Spark。
最后,Python 的字符串和文件操作非常简单,使在空格处拆分句子等任务成为单行命令。总体而言,Python 在字符串处理、AI 生态系统和机器学习库方面的优势相结合,使其成为 NLP 开发的理想语言。
NLP 的应用
- 文本分类涉及将文本数据分类为预定义的类别或类。此功能在各个领域都非常有用,例如垃圾邮件检测、情绪分析和主题建模。
- 命名实体识别 (NER) 涉及从文本数据中识别和提取实体,例如人员、组织和位置。这可能在各种情况下被证明是有益的,包括从新闻文章或社交媒体帖子等来源提取信息。
- 词性 (POS) 标记是指使用其相应的词性(例如名词、动词、形容词或副词)标记句子中的每个单词的过程。这个过程在语言分析中至关重要,因为它使机器能够理解句子的语法结构并识别句子中不同单词的作用。准确标记句子中的词性有助于提高各种 NLP 应用程序的性能,例如文本分类、机器翻译和情感分析。
- 语言建模涉及构建语言的概率模型,以预测给定单词序列的可能性。这在各种上下文中都很有用,例如语音识别和机器翻译。
- 机器翻译是 NLP 的另一个重要应用,涉及开发可以自动将文本从一种语言翻译成另一种语言的系统。这在各种情况下都很有用,例如国际商务或跨文化交流。
- 信息检索包括创建能够从大量文本数据中提取相关信息的系统和算法。此功能在各种设置中都很有价值,包括搜索引擎或推荐系统。
- 问题解答系统旨在构建可以回答以自然语言提出的问题的自动化系统。此功能在各种场景中都非常有用,包括客户服务或教育环境。
- 文本摘要是 NLP 的另一个重要应用,涉及生成较长文本的摘要,例如文章或文档。
- 文本生成与创建可生成自然语言文本的系统有关,例如提供写作帮助的语言模型或聊天机器人。这种能力在许多领域都很有价值,例如客户支持或创意写作。
- 语音识别,也称为自动语音识别 (ASR) 或语音到文本的转换,涉及将口语自动转换为文本。它是许多 NLP 系统的关键组件,用于广泛的应用程序,包括虚拟助手、语音转文本听写软件和交互式语音响应系统。
本博客将重点介绍文本分析,主要是数据准备。
Python 中流行的 NLP 库
Python 中提供了几种流行的 NLP 库,它们为文本处理和分析提供了广泛的功能。一些最常用的 NLP 库是:
自然语言工具包 (NLTK)
NLTK 是用于 NLP 任务的常用开源库。它为分词、词性标记、解析、情感分析等任务提供了广泛的工具。
SpaCy
spaCy 是另一个著名的 NLP 任务开源库。它以其高性能和对大型文本数据的高效处理而闻名。它为分词化、词性标记、解析、命名实体识别等任务提供了工具。
Python 中一些知名 NLP 库的 logo
文本 Blob
TextBlob 为常见的 NLP 任务提供了一个简单的 API,例如情感分析、词性标记和名词短语提取。它构建在 NLTK 之上,为常见的 NLP 任务提供了一个易于使用的界面。
Gensim 公司
Gensim 主要用于主题建模和自然语言处理。它提供了用于构建和训练主题模型的工具,例如潜在狄利克雷分配 (LDA) 和潜在语义分析 (LSA)。
scikit-学习
scikit-learn 提供了一些 NLP 工具,例如文本预处理、特征提取和文本数据的分类算法。
文本分析及步骤&代码
文本分析或文本挖掘是从文本数据中提取有用信息和见解的过程。它涉及几个步骤,大致可分为以下几类:
注意: 代码中将使用可执行的简单 Python 库。但是,NLTK 库还包括不可执行的代码。
数据准备
该步骤包括清理和预处理数据,使其为分析做好准备。这些步骤包括:
- 句子分割:句子分割是将文本分成单个句子的过程。
def sentenceSegment(text):
sentences = []
start = 0
for i in range(len(text)):
if text[i] == '.' or text[i] == '!' or text[i] == '?':
sentences.append(text[start:i+1].strip())
start = i + 1
return sentences
# Hello, NLP world!!在这个例子中,我们将学习稍后将使用的文本处理的基础知识。
text = "'Hello, NLP world!', '!', 'In this example, we are going to do the basics of Text processing which will be used later."
print(sentenceSegment(text))
现在,这是使用nltk
库进行句子分割:
import nltk
nltk.download('punkt')
text = "'Hello, NLP world!', '!', 'In this example, we are going to do the basics of Text processing which will be used later."
sentences = nltk.sent_tokenize(text)
print(sentences)
输出
['Hello, NLP world!', '!', 'In this example, we are going to do the basics of Text processing which will be used later.']
- 删除不需要的字符、标点符号、符号等。
import string
def remove_punctuation(input_string):
# 定义一串标点符号和符号
punctuations = string.punctuation
# 从输入字符串中删除标点符号和符号
output_string = "".join(char for char in input_string if char not in punctuations)
return output_string
text = "Hello, NLP world!! In this example, we are going to do the basics of Text processing which will be used later."
sentences = sentenceSegment(text)
puncRemovedText = remove_punctuation(text)
print(puncRemovedText)
- 将字符串转换为小写:这可以通过将大写和小写的单词视为同一单词来帮助减小词汇表大小,这有助于完成一些 NLP 任务,例如文本分类和情绪分析。
def convertToLower(s):
return s.lower()
text = "Hello, NLP world!! In this example, we are going to do the basics of Text processing which will be used later."
puncRemovedText = remove_punctuation(text)
lowerText = convertToLower(puncRemovedText)
print(lowerText)
- 分词化:将文本分词化为单词、短语或句子。在下面的代码中,空格被标记化。
#在这段代码中,我们没有使用任何库
#不使用字符串中的任何函数或任何其他函数进行标记。
#仅使用循环和if/else
def tokenize(s):
words = [] #token words should be stored here
i = 0
word = ""
while(i <len(s)):
if (s[i] != " "):
word = word+s[i]
else:
words.append(word)
word = ""
i = i + 1
words.append(word)
return words
text = "Hello, NLP world!! In this example, we are going to do the basics of Text processing which will be used later."
puncRemovedText = remove_punctuation(text)
lowerText = convertToLower(puncRemovedText)
tokenizedText = tokenize(lowerText)
print(tokenizedText)
接下来,使用nltk库进行标记化
import nltk
# 定义输入文本
text = "Hello, NLP world!! In this example, we are going to do the basics of Text processing which will be used later."
#句子切分-去除标点符号并转换为小写
sentences = nltk.sent_tokenize(text)
puncRemovedText = remove_punctuation(text)
lowerText = convertToLower(puncRemovedText)
# 对文本进行标记
tokens = nltk.word_tokenize(lowerText)
# 输出
print(tokens)
输出将如下所示:
['hello', 'nlp', 'world', 'in', 'this', 'example', 'we', 'are', 'going', 'to', 'do', 'the', 'basics', 'of', 'text', 'processing', 'which', 'will', 'be', 'used', 'later']
像“we are”和“John’s”这样的单词可以使用nltk库中的nltk.word_tokenize函数进行标记。word_tokenize函数使用一个标记器,该标记器经过训练,可以识别自然语言文本中的常见模式,如缩写和所有格,并将其拆分为单独的标记。
import nltk
sentence = "We're going to John's house today."
tokens = nltk.word_tokenize(sentence)
print(tokens)
输出
['We', "'re", 'going', 'to', 'John', "'s", 'house', 'today', '.']
应删除停用词,如“the”或“and”等常用词,这些词对分析没有帮助。在这个例子中,假设所有长度小于三的单词都将被删除。这是因为较短的停用词更有可能是冠词、介词或连词,它们本身不太可能具有重要意义。因此,删除这些停用词可以帮助减少文本数据中的噪声,而不会丢失太多重要的信息或上下文。
def stopWordRemoval(words):
j = 0
while (j < len(words)):
if(len(words[j]) < 3):
words.remove(words[j])
else:
j = j + 1
return words
text = "Hello, NLP world!! In this example, we are going to do the basics of Text processing which will be used later"
puncRemovedText = remove_punctuation(text)
lowerText = convertToLower(puncRemovedText)
tokenizedText = tokenize(lowerText)
cleaned = stopWordRemoval(tokenizedText)
print(cleaned)
这是一个使用nltk库删除停用词的代码:
import nltk
from nltk.corpus import stopwords
# 定义输入文本
text = "Hello, NLP world!! In this example, we are going to do the basics of Text processing which will be used later."
puncRemovedText = remove_punctuation(text)
lowerText = convertToLower(puncRemovedText)
tokenizedText = tokenize(lowerText)
# 定义停用词
stop_words = set(stopwords.words("english"))
# 移除停用词
filtered_tokens = [token for token in tokenizedText if token.lower() not in stop_words]
# 输出
print(filtered_tokens)
输出
['hello', 'nlp', 'world', 'example', 'basics', 'text', 'processing', 'used', 'later']
如上所述,this,we,are,going,to,do,the,of,which,will,be中的停止词已从原始标记列表中删除。
对文本进行词干或词形化,以将单词还原为基本形式。波特词干算法也是NLTK库中使用的最著名的词干算法之一。
import nltk
from nltk.corpus import stopwords
from nltk.stem import PorterStemmer
# 定义输入文本
text = "Hello, NLP world!! In this example, we are going to do the basics of Text processing which will be used later."
# 标记文本
tokens = nltk.word_tokenize(text)
# 标记停用词
stop_words = set(stopwords.words("english"))
# 移除
filtered_tokens = [token for token in tokens if token.lower() not in stop_words]
# 执行
stemmer = PorterStemmer()
stemmed_tokens = [stemmer.stem(token) for token in filtered_tokens]
# 输出
print(stemmed_tokens)
输出
['hello', 'nlp', 'world', 'exampl', 'basic', 'text', 'process', 'use', 'later']
文本浏览
此步骤涉及探索和可视化文本数据,以获得洞察并识别模式。文本浏览涉及的步骤包括:
- 使用术语频率-逆文档频率 (TF-IDF) 等技术计算文本中单词或短语的频率。然后,TF-IDF 可用于创建词云或可视化,以识别和显示最常见或最重要的术语。
- 使用搭配分析或共现矩阵等技术识别单词或短语的共现。
- 二元语法是一种搭配,表示文本语料库中经常共出现的两个相邻单词。例如,“machine learning” 是一个 bigram,经常一起出现在 NLP 相关文本中。
- 互信息是一种统计度量,可用于识别文本语料库中单词或短语的重要共现情况。它衡量一个单词或短语的出现与同一上下文中另一个单词或短语的出现程度相关。互信息也可用于识别单词之间有意义的搭配或关联。
- 使用聚类分析技术将相似的文本数据分组在一起。
- 使用语言建模技术生成在样式和内容上与给定文本语料库相似的新文本。请注意,语言建模涉及预测给定上下文中单词序列的概率。
文本分析
此阶段需要检查文本数据以提取有价值的信息并得出结论。文本分析涉及的步骤包括:
- 情绪分析,用于确定文本的整体情绪(积极、消极或中性)。
- 命名实体识别,用于识别和提取实体,例如人员、组织或位置。
- 文本分类 - 将文本分类为预定义的类别或标签。
- 文本摘要 生成文本数据的摘要。
- 主题建模,用于识别文本语料库中的潜在主题或主题,而无需事先了解这些主题可能是什么。