Python Web Scraping 简明教程
Python Web Scraping - Dealing with Text
在上一章中,我们了解了如何处理作为网络爬取内容一部分获得的视频和图片。在本章中,我们将使用 Python 库来处理文本分析,并详细了解其相关内容。
Introduction
您可以使用名为自然语言工具包 (NLTK) 的 Python 库来执行文本分析。在深入了解 NLTK 概念之前,我们先了解文本分析和网络爬取之间的关系。
分析文本中的单词可以帮助我们了解哪些单词很重要,哪些单词不常见,单词如何分组。此项分析简化了网络爬取任务。
Getting started with NLTK
自然语言工具包 (NLTK) 是 Python 库的集合,专门为识别和标记自然语言(如英语)文本中发现的词性而设计。
Installing Other Necessary packages
我们还需要其他一些 Python 软件包,如 gensim 和 pattern ,才能使用 NLTK 执行文本分析以及构建自然语言处理应用程序。
gensim − 一个强大的语义建模库,适用于许多应用。可以通过以下命令进行安装 −
pip install gensim
pattern − 用于使 gensim 软件包正常工作。可以通过以下命令进行安装 −
pip install pattern
Tokenization
将给定文本分解为称为标记的较小单位的过程称为标记化。这些标记可以是单词、数字或标点符号。它也称为 word segmentation 。
Example
NLTK 模块为标记化提供了不同的软件包。我们可以根据需要使用这些软件包。此处描述了其中一些软件包 −
sent_tokenize package − 此软件包将输入文本划分为句子。可以使用以下命令导入此软件包 −
from nltk.tokenize import sent_tokenize
word_tokenize package − 此软件包将输入文本划分为单词。可以使用以下命令导入此软件包 −
from nltk.tokenize import word_tokenize
WordPunctTokenizer package − 此软件包将输入文本以及标点符号划分为单词。可以使用以下命令导入此软件包 −
from nltk.tokenize import WordPuncttokenizer
Stemming
在任何语言中,单词都有不同的形式。由于语法原因,语言包含许多变体。例如,考虑以下单词 democracy 、 democratic 和 democratization 。对于机器学习以及网络爬取项目,机器可以理解这些不同的单词具有相同的词干很重要。因此,我们可以说在分析文本时,提取单词的词干可能很有用。
这可以通过词干提取来实现,词干提取可以定义为通过切掉单词结尾来提取单词基本形式的启发式过程。
NLTK 模块提供了不同的词干提取包。我们可以根据需要使用这些包。其中一些包此处进行了说明 -
PorterStemmer package - 此 Python 词干提取包使用波特算法来提取基本形式。您可以使用以下命令导入此包 -
from nltk.stem.porter import PorterStemmer
例如,在此词干提取器中输入单词 ‘writing’ 后,词干提取后的输出将是单词 ‘write’ 。
LancasterStemmer package - 此 Python 词干提取包使用兰开斯特算法来提取基本形式。您可以使用以下命令导入此包 -
from nltk.stem.lancaster import LancasterStemmer
例如,在此词干提取器中输入单词 ‘writing’ 后,词干提取后的输出将是单词 ‘writ’ 。
SnowballStemmer package - 此 Python 词干提取包使用 Snowball 算法来提取基本形式。您可以使用以下命令导入此包 -
from nltk.stem.snowball import SnowballStemmer
例如,在此词干提取器中输入单词“writing”后,词干提取后的输出将是单词“write”。
Lemmatization
提取单词基本形式的另一种方法是词形还原,通常通过使用词汇表和形态分析去除屈折词尾。任何单词在词形还原之后的单词基本形式被称为词形。
NLTK 模块提供了以下词形还原包 -
WordNetLemmatizer package - 它会根据单词用作名词还是动词来提取基本形式。您可以使用以下命令导入此包 -
from nltk.stem import WordNetLemmatizer
Chunking
分块是指将数据分成小块,这是自然语言处理中用于识别词性和小短语(如名词短语)的重要过程。分块是标记令牌。我们可以借助分块过程来获取句子的结构。
Step 3 − The Output
在最后一步中,输出将以树格式生成。
首先,我们需要按如下方式导入 NLTK 包 -
import nltk
接下来,我们需要定义句子。此处 DT:限定词,VBP:动词,JJ:形容词,IN:介词和 NN:名词。
sentence = [("a", "DT"),("clever","JJ"),("fox","NN"),("was","VBP"),("jumping","VBP"),("over","IN"),("the","DT"),("wall","NN")]
接下来,我们以正则表达式的形式给出了语法。
grammar = "NP:{<DT>?<JJ>*<NN>}"
现在,下一行代码将定义用于解析语法的一个解析器。
parser_chunking = nltk.RegexpParser(grammar)
现在,解析器将解析这个句子。
parser_chunking.parse(sentence)
然后,我们把输出保存在变量里。
Output = parser_chunking.parse(sentence)
借助以下代码,我们能够图形化输出,如图所示。
output.draw()
Bag of Word (BoW) Model Extracting and converting the Text into Numeric Form
单词袋 (BoW) 是自然语言处理中一个有用的模型,主要用于提取文本中的特征。从文本中提取特征后,它可用于机器学习算法中的建模,因为原始数据不能用于 ML 应用程序。
Building a Bag of Words Model in NLTK
我们来看一看以下 Python 脚本,它将在 NLTK 中构建一个 BoW 模型。
首先,导入以下包:
from sklearn.feature_extraction.text import CountVectorizer
接下来,定义句子集:
Sentences=['This is an example of Bag of Words model.', ' We can extract
features by using Bag of Words model.']
vector_count = CountVectorizer()
features_text = vector_count.fit_transform(Sentences).todense()
print(vector_count.vocabulary_)
Topic Modeling: Identifying Patterns in Text Data
通常,文档被分组为主题,主题建模是一种用于识别文本中与特定主题相对应的模式的技术。换句话说,主题建模用于发现给定文档集中的抽象主题或隐藏结构。
你可以在以下情况下使用主题建模:
Topic Modeling Algorithms
我们可以使用以下算法来实现主题建模 −
Latent Dirichlet Allocation(LDA) − 它是使用概率图形模型来实现主题建模的最流行算法之一。
Latent Semantic Analysis(LDA) or Latent Semantic Indexing(LSI) − 它基于线性代数,并在文档术语矩阵上使用 SVD(奇异值分解)的概念。
Non-Negative Matrix Factorization (NMF) − 它也基于线性代数,如 LDA。
上面提到的算法将具有以下元素 −
-
Number of topics: Parameter
-
Document-Word Matrix: Input
-
WTM(单词主题矩阵)和 TDM(主题文档矩阵):输出