玉来愈宏的随笔 2018-08-03
点击上方关注,All in AI中国
作者——Ridham Dave
各位,欢迎来到我的第一个技术教程。在本教程中,我将对不同的网站进行解释提取、清理和分类。我将在python环境运行我的数据抓取代码,并使用神经网络对网站进行分类。
文本分类是自然语言处理(NLP)在数据科学的许多不同领域中广泛使用的任务之一。一个高效的文本分类器可以利用NLP算法高效地将数据分类。
文本分类是监督机器学习任务的一个例子,因为包含文本文档及其标签的标记数据集,故多用于训练分类器。
常用的文本分类技术有:
朴素贝叶斯分类器(https://en.wikipedia.org/wiki/Naive_Bayes_classifier)
线性分类器(https://en.wikipedia.org/wiki/Linear_classifier)
支持向量机(https://en.wikipedia.org/wiki/Support_vector_machine)
Baggin模型(https://en.wikipedia.org/wiki/Bootstrap_aggregating)
Boosting模型(https://en.wikipedia.org/wiki/Gradient_boosting)
深度神经网络(https://en.wikipedia.org/wiki/Deep_learning)
Web抓取、Web获取或Web数据提取是用于从网站中提取数据进行数据抓取。通常,这是通过模拟人类上网来从不同的网站收集指定的信息的软件来完成的。
可用于Web抓取的一些技术包括:
在本教程中,我们将尝试将完整的模型实现为三个不同的模块:
模块1:数据抓取
在这个模块中,我将使用Python 3.5环境来实现我的脚本。因此,请遵循完整的参考。
步骤1:从网站请求数据
要提取web数据,可以使用许多不同的包,但在本教程中,我将使用:
在上面的代码中,requests.get()方法将使用https协议从网站发出请求,并将页面加载到对象"page(页面)"中。下一行代码将HTML代码移动到字符串html_code。因此,到目前为止,我们已经从网站中提取数据,但它仍然是HTML格式,这与实际文本有很大的不同。
步骤2:从HTML页面中提取文本
为了从HTML页面中提取完整的文本数据,可以用这两个包,BeautifulSoup(https://www.crummy.com/software/BeautifulSoup/bs4/doc/)和html2text(https://pypi.org/project/html2text/)。使用上一步中找到的html_code字符串,我们可以应用以下两种方法中的任何一种。
在上面的片段中,BeautifulSoup包将解析HTML代码并将数据分配给soup对象。findall() 函数查找代码中的所有可见文本,并返回我们存储在文本中的String列表中。最后,我们使用JOIN()函数将所有单个文本连接到一个公共字符串中。
在这个备用块中,我们使用html2text包来解析字符串,并直接从HTML代码中获取文本。另外,我们需要用空格替换空行,并最后找到text_from_html。
类似地,我们可以在大约1000+URL上使用一个循环,并从这些站点提取数据,并以CSV(逗号分隔值)格式存储它们,我们可以在分类模块中进一步使用该格式。
模块2:基于关键字的分类
对于任何机器学习算法,我们都需要一些训练集和测试集来训练模型并检验模型的准确性。因此,为了创建模型的数据集,我们已经有了来自不同网站的文本,我们只需根据关键词进行分类,然后将结果应用到下一个模块中。
在本教程中,我们将网站分为三类,即:
科技、办公及教育产品网站(1级)
消费品网站(2级)
工业工具及五金产品网站(第3级)
这里的方法是,我们将拥有属于特定类别的特定关键字,并将这些关键字与文本匹配,并找到具有最大匹配值的类。
Matching_value =(与一个行业匹配的关键词数量)/(匹配的关键词总数)
因此,我们有一个针对各个类别的关键词列表,如下:
现在,我们将使用KeywordProcessor(https://pypi.org/project/flashtext/)查找文本中从URL收到的关键字。
KeywordProcessor可在pypi上的FlashText包中使用。
在上面的代码中,我们将使用关键字加载KeywordProcessor对象,我们将进一步使用这些关键字来查找匹配的关键字。
要查找匹配值的百分比值,我们定义函数百分比如下:
现在,我们将使用提取关键字(String)方法来查找文本中的关键字。我们将找到该列表的长度,以查找文本中匹配关键字的数量。下面的函数将查找百分比,并选择具有最大百分比的类。
对上述函数进行循环,我们基本可以找到大部分网站类别的关键字。我们将把机密数据保存到一个Data.csv文件中,Data.csv我们还会进一步使用。现在,我们已经准备好了数据集,可以应用神经网络进行分类。
模块3:应用神经网络
在下面的实现中,我们将从头创建一个神经网络,并使用NLTKWord标记器进行预处理。首先,我们需要导入从上述步骤获得的数据集,并将其加载到列表中。
以上代码将加载和清理机密数据。空值将被删除。
下面的代码将针对其类创建数据字典。
为了应用神经网络,我们需要将语言单词转换成数学符号,用于计算。换句话说,我们将形成一个跨越所有字符串的所有单词的列表。
例如,输出将是:
1594个文档
3类("1类"、"3类"、"2类")
独特词根词40000
现在,我们将为模式创建一个标记词列表,并使用NLTK Lancaster Stemmer创建一个单词包。
输出:
#Word 41468
#第3类
现在,我们对数据进行最后的预处理,并创建一些函数。
Sigmoid函数
清洗功能(Cleaning function)
词袋功能(Bag Of Words function)
在神经网络中使用的最后一个功能是:思维功能(Think function)
现在我们开始训练我们的神经网络模型。我们将通过Scratch实现它,并将使用逻辑回归进入到每个神经元。虽然只有一层,但会进行50000次(迭代),我们将训练我们的模式。完整的训练示例将在CPU上运行。
最后,我们将对模型进行训练,
输出:
训练10个神经元,alpha:0.1, dropout:False
输入矩阵:1594x41468输出矩阵:1x3
10000次迭代后delta:0.0665105275385
20000次迭代后delta:0.0610711168863
30000次迭代后delta:0.0561908365355
40000次迭代后delta:0.0533465919346
50000次迭代后delta:0.0461560407785
将突触保存到synapses.json
处理时间:33060.51151227951秒
正如我们所看到的,训练这个模型花费了将近11个小时。经过如此密集的计算,我们准备测试这些数据。
测试数据的函数:
让我们测试模型的准确性:
输出:
("3级",0.97663437888614435)
输出:
("1级",0.9620297535870017)
正如你所看到的,我们在这些测试中获得了相当高的精确度。我在不同的数据上尝试过这个模型,并发现了相当高的精确度。
在这种只有一层的模型中,大约95%+的精度被认为是相当精确的。对于不同模型的进一步分类,我们可以使用Keras或TensorFlow。为了减少训练模型的时间,我们可以使用NVIDIA GPU。
现在,利用深度神经网络、BP神经网络,都可以方便地对数据进行抓取和分类。