使用Selenium爬取百度百科与Jieba中文分词技术解析故宫著名景点

讲述了很多关于 Python 爬取本体 Ontology 的例子,也讲述了很多关于 Python 爬取消息盒 InfoBox 的例子,还讲述了很多关于 Python 爬取虎扑图片的例子,同时讲述了 VSM 向量空间模型的应用。InfoBox 没有前后文和语义概念,因此效果不佳。这篇文章主要是爬取百度 5A 景区的摘要信息,接着利用 Jieba 分词工具进行中文分词,最后提出关于文本聚类算法的一些概念知识。

使用Selenium爬取百度百科与Jieba中文分词技术解析故宫著名景点

一. Selenium爬取百度百科摘要

    简单给出Selenium爬取百度百科5A级景区的代码:  
# coding=utf-8  
""" 
2015 年 12 月 10 日创建,作者是 Eastmount。
"""  
  
import time          
import re          
import os  
import sys
import codecs
import shutil
使用 selenium 库,调用其中的 webdriver 模块。
在 selenium 的 webdriver 中,common 目录下的 keys 模块包含了 Keys 类。
导入 selenium.webdriver.support.ui 并将其命名为 ui 。
使用 selenium 的 webdriver 时,其中的 common 模块包含了 ActionChains 类。
  
#Open PhantomJS  
driver 为 webdriver.PhantomJS,其可执行路径为 "G:\phantomjs-1.9.1-windows\phantomjs.exe"
#driver = webdriver.Firefox()  
ui.WebDriverWait(driver, 10) 被赋值给 wait 变量
获取 5A 级旅游景点的内容。
获取信息框(entityName,fileName)。
    try:  
        #create paths and txt files
打印出“文件名称: ”,后面接着 fileName
使用 codecs 库打开名为 fileName 的文件,以写入模式('w')打开,并且使用 utf-8 编码。
2. 要进行文件写入操作。
语言风格需保持原文风格,且要去掉最前面的序号,同时把长句拆分成多个较短的分句。
也许自从被查找之后,这个页面就已经发生了变化。
        #解决方法: 使用Selenium和Phantomjs
打印 u'实体名称: ',然后打印 entityName 并去除其末尾的 '\n'
司机打开了“http://baike.baidu.com/”这个网址。
driver 找到一个元素,该元素通过 XPath 定位,其路径为 "//form[@id='searchForm']/input",这个元素被赋值给 elem_inp 。
elem_inp 向其中发送了实体名这个键值。
elem_inp 发送了回车键。
info 写入 entityName 并去掉末尾的换行符(\n),然后加上回车换行符(\r\n)。需要注意的是,codecs 不支持直接使用 \n 进行换行操作。
  
        #load content 摘要
driver 找到的元素通过 xpath 为“//div[@class='lemma-summary']/div”,这些元素被赋值给 elem_value 。
        for value in elem_value:
            print value.text
info 写入(value.text 加上 '\r\n')
        #爬取文本信息
        #爬取所有段落
内容 class='para-title' 是标题 [省略] time.sleep(2) 除了 Exception 之外,对于 e:# 'utf8' 编码无法解码字节的情况 print "Error: ",e finally: print '\n' info.close() #Main function def main(): #By function get information path = "BaiduSpider\\" if os.path.isdir(path): shutil.rmtree(path, True) os.makedirs(path) 打开名为 "Tourist_spots_5A_BD.txt" 的文件,将其赋值给 source 变量,使用的模式为 'r'(只读模式)。 num = 1 for entityName in source: 将 entityName 转换为 utf-8 编码的形式,即 entityName = unicode(entityName, "utf-8") 。 如果在实体名称中包含“故宫”: # 否则添加一个“?” entityName = u'北京故宫' name = "d" % num 文件名等于路径加上名称字符串再加上“.txt” 获取实体名的信息框并保存到文件名中。 num = num + 1 输出 'End Read Files!' source.close() driver.close() 如果当前模块的名称等于“__main__”。 main()

内容如下图所示,共204个国家5A级景点的摘要信息。

二. Jieba中文分词

Python 中有很多分词工具,其中有盘古分词。Python 中还有 Yaha 分词。Python 里也有 Jieba 分词等。
    中文分词库:  
它们的基本用法相差不大。然而,Yaha 分词无法处理“黄琉璃瓦顶”或“圜丘坛”等词。正因如此,使用了结巴分词。
    **1.安装及入门介绍**  
    参考地址:  
    下载地址:  
Python 2.0 我推荐使用“pip install jieba”这种方式进行全自动安装,也可以使用“easy_install jieba”来安装。安装完成后,通过 import jieba 来引用。需要注意的是,第一次 import jieba 时需要构建 Trie 树,这个过程需要等待几秒时间。
安装时若出现错误“unknown encoding: cp65001”,那么就输入“chcp 936”,这样就能把编码方式从 utf-8 转变为简体中文 gbk。

请明确需求呀,你只是给了一个链接,没有具体的句子内容呢,没法进行改写呢。

    结巴中文分词涉及到的算法包括:  
基于 Trie 树结构来实现高效的词图扫描,进而生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)。
采用动态规划来查找最大概率路径,并且找出基于词频的最大切分组合。
对于未登录词,采用了以汉字成词能力为基础的 HMM 模型,并且运用了 Viterbi 算法。
    结巴中文分词支持的三种分词模式包括:  
    (1) 精确模式:试图将句子最精确地切开,适合文本分析;  
全模式下,会把句子中所有可以成词的词语都进行扫描,其速度相当快,然而却无法解决歧义问题。
搜索引擎模式:以精确模式为基础,对长词进行再次切分,这样能提高召回率,并且适合用于搜索引擎分词。
    同时结巴分词支持繁体分词和自定义字典方法。  
#encoding=utf-8
import jieba
#全模式
text = "我来到北京清华大学"
jieba 对 text 进行全模式切割,得到的切割结果为 seg_list 。
打印 u"[全模式]:",将 seg_list 中的元素用"/"连接起来并输出
#精确模式
jieba 对 text 进行分词操作,切词模式为精确模式,分词结果存储在 seg_list 中。
打印 u"[精确模式]:",然后将 seg_list 中的元素用 "/" 连接起来并输出。
#默认是精确模式
seg_list = jieba.cut(text)
打印 u"[默认模式]:" ,将 seg_list 中的元素用 "/" 连接起来并输出
“杭研”未在词典中,然而却被 Viterbi 算法识别出来了。
这个地方是网易杭研大厦。
打印“[新词识别]:”,将 seg_list 中的元素用“/”连接起来并输出
#搜索引擎模式
使用 jieba 进行搜索式分词,得到的分词结果保存在 seg_list 中。
打印 u"[搜索引擎模式]:",将 seg_list 中的元素用"/"连接起来
    输出如下图所示:  

请提供具体需要改写的句子呀,你只给了一个链接但没有实际的句子内容呢。

    代码中函数简单介绍如下:  
jieba.cut(),其中第一个参数是需要进行分词的字符串,第二个参数 cut_all 用于控制是否采用全模式进行分词。
jieba.cut_for_search() 只有一个参数,这个参数是需要分词的字符串。这种方法适用于搜索引擎构造倒排索引的分词工作,并且分词的粒度较为细小。
其中待分词的字符串能够支持 gbk 格式、utf-8 格式以及 unicode 格式。返回的结果是一个可以进行迭代的 generator 。可以通过 for 循环来获取分词后的每一个词语。更为推荐的是将其转换为 list 列表。
    **2.添加自定义词典**  
“国家 5A 级景区”包含诸多旅游相关的专有名词,例如:

[输入文本] 故宫的著名景点包括乾清宫、太和殿和黄琉璃瓦等

故宫的著名景点有黄琉璃瓦。

故宫的著名景点包括乾清宫、太和殿和黄琉璃瓦等。

显然,“乾清宫”、“太和殿”以及“黄琉璃瓦”(假设为一个文物)可能会因分词而被分开,这是很多分词工具所存在的一个缺陷。然而,Jieba 分词允许开发者使用自定义的词典,这样就能包含在 Jieba 词库里没有的词语。尽管 Jieba 本身具有新词识别能力,但自行添加新词能够确保更高的正确率,尤其是对于专有名词而言。

jieba 有一个基本用法,即通过 jieba.load_userdict(file_name) 来加载自定义词典,其中 file_name 为自定义词典的路径。

词典格式与 dict.txt 相同,一个词占据一行。每一行由三部分构成,一部分是词语,另一部分是词频,最后一部分是词性(可以省略,若为 ns 则表示地点名词),各部分之间用空格隔开。

强烈推荐一篇词性标注文章,链接如下:

#encoding=utf-8
import jieba
#导入自定义词典
加载用户词典“dict.txt”。
#全模式
故宫的著名景点有黄琉璃瓦。
seg_list = jieba.cut(text, cut_all=True)
print u"[全模式]: ", "/ ".join(seg_list) 
#精确模式
seg_list = jieba.cut(text, cut_all=False)
print u"[精确模式]: ", "/ ".join(seg_list)
#搜索引擎模式
seg_list = jieba.cut_for_search(text) 
print u"[搜索引擎模式]: ", "/ ".join(seg_list)

请提供需要改写的句子呀,你没有给出具体的内容呢。

3.关键词提取

在构建 VSM 向量空间模型时,或者在将文本转换成数学形式进行计算的过程中,你需要用到关键词提取的技术。在此,对该内容进行补充说明,而其他方面,如词性标注、并行分词、获取词位置以及搜索引擎等内容则不再进行叙述。

jieba.analyse.extract_tags 这个方法用于提取句子中的关键词,topK 表示要提取的关键词的数量。通过这个方法,我们可以从给定的句子中提取出最具代表性的关键词。

要先进行 import jieba.analyse 操作。这里有一个待提取的文本 sentence,还有一个参数 topK 用于指定返回几个 TF/IDF 权重最大的关键词,其默认值为 20。

#encoding=utf-8
import jieba
import jieba.analyse
#导入自定义词典
jieba.load_userdict("dict.txt")
#精确模式
故宫的著名景点包含乾清宫。乾清宫十分精美。故宫的著名景点还有太和殿。故宫的著名景点也包括午门等。午门是紫禁城的正门。午门处于居中的位置且向阳。
seg_list = jieba.cut(text, cut_all=False)
print u"分词结果:"
print "/".join(seg_list)
#获取关键词
通过 jieba.analyse.extract_tags 函数提取出 text 中的前 3 个标签,这些标签被存储在 tags 中。
print u"关键词:"
print " ".join(tags)

请提供需要改写的句子呀,没有具体内容呢。

>>> 
分词结果:
故宫的著名景点包含乾清宫、太和殿以及午门等。乾清宫十分精美。午门是紫禁城的正门,且午门处于居中的位置并朝向阳光。
关键词:
午门 乾清宫 著名景点
>>> 

4.对百度百科获取摘要分词

读取 BaiduSpider 文件中的 0001.txt 到 0204.txt 文件,然后对这些文件分别进行分词处理,最后将处理后的结果保存下来。

#encoding=utf-8
import sys
import re
import codecs
import os
import shutil
import jieba
import jieba.analyse
#导入自定义词典
加载名为“dict_baidu.txt”的用户词典。
#Read file and cut
def read_file_cut():
    #create path
    path = "BaiduSpider\\"
respath 是 "BaiduSpider_Result\\" 这个路径
    if os.path.isdir(respath):
        shutil.rmtree(respath, True)
    os.makedirs(respath)
    num = 1
    while num<=204:
        name = "d" % num 
        fileName = path + str(name) + ".txt"
        resName = respath + str(name) + ".txt"
        source = open(fileName, 'r')
        if os.path.exists(resName):
            os.remove(resName)
        result = codecs.open(resName, 'w', 'utf-8')
        line = source.readline()
        line = line.rstrip('\n')
        
        while line!="":
            line = unicode(line, "utf-8")
            seglist = jieba.cut(line,cut_all=False)  #精确模式
            output = ' '.join(list(seglist))         #空格拼接
            print output
            result.write(output + '\r\n')
            line = source.readline()
        else:
            print 'End file: ' + str(num)
            source.close()
            result.close()
        num = num + 1
    else:
        print 'End All'
#Run function
if __name__ == '__main__':
    read_file_cut()

5.去除停用词

在信息检索里,为了节省存储空间并且提高搜索效率,在对自然语言数据(或文本)进行处理之前或者之后,会自动把某些字或者词给过滤掉。这些被过滤掉的字或词,就被叫做 Stop Words(停用词)。这些停用词是人工输入进去的,并非自动化生成的,生成之后就会形成一个停用词表。然而,并没有一个确切的停用词表能够适用于所有的工具。有一些工具是明确地以避免使用停用词的方式来支持短语搜索的。

#encoding=utf-8
import jieba
#去除停用词
stopwords 等于一个空字典,这个空字典通过 fromkeys 方法创建,fromkeys 方法的参数是一个包含 '的'、'包括'、'等'、'是'这些元素的列表。
故宫有一些著名景点。这些景点包括乾清宫。乾清宫非常精美。还有太和殿。以及午门等。午门是紫禁城的正门。
jieba 对 text 进行分词,cut_all 参数设置为 False,分词结果存储在 segs 中
final = ''
for seg in segs:
seg 被使用“utf-8”编码进行了编码操作。
    if seg not in stopwords:
            final += seg
print final
故宫有著名景点乾清宫、太和殿以及午门。乾清宫的精美程度十分突出。午门是紫禁城的正门。
seg_list 是通过 jieba 对 final 进行分词操作得到的,且 cut_all 参数被设置为 False
print "/ ".join(seg_list)
故宫是著名景点,包括乾清宫、太和殿和午门。其中,乾清宫非常精美,午门是紫禁城的正门。

三. 基于VSM的文本聚类算法

这部分主要以 2008 年上海交通大学姚清坛等的《基于向量空间模型的文本聚类算法》这篇论文为参考。由于我的实体对齐在使用 InfoBox 时存在诸多问题,并且发现对齐过程中会用到文本内容以及聚类算法,所以简要讲述一下文章中的一些知识。

语言聚类的主要依据在于聚类假设,即同类的文档相似度较大,而非同类文档相似度较小。并且会同时运用无监督学习方法,因为聚类不需要训练过程,也不需要预先对文档进行手工标注类别,所以具备较高的灵活性和自动化处理能力。主要包含以下部分:

(1) 预处理常用方法

进行语言文本的预处理工作,包括词性标注和语义标注。接着构建统计词典。之后对文本进行词条切分操作。最终完成了文本信息的分词过程。

(2) 文本信息的特征表示

采用的方法包含布尔逻辑型、概率型、混合型以及向量空间模型。向量空间模型 VSM 是把文档映射成向量的形式,像 (T1, T2, …, Tn) 这样能表示文档词条,而 (W1, W2, …, Wn) 则表示文档词条对应的权重。建立文本特征主要通过特征项或词条来体现目标文本信息,构建评价函数以体现词条权重,尽最大努力区分不同的文档。

(3) 文本信息特征缩减

VSM 文档的特征向量维度是很多的。所以,在对文本进行聚类之前,要运用文本信息特征集来进行缩减。针对每个特征词的权重进行排序,然后选取最佳的特征,这里面包含 TF-IDF。推荐使用向量稀疏表示的方法,这样可以提升聚类的效果,其中(D1, D2, …, Dn)指的是权重不为 0 的特征词条。

(4) 文本聚类

数学课分析形势之后,接下来要在这个数学基础上进行文本聚类。文本聚类包含基于概率方法和基于距离方法。基于概率方法是利用贝叶斯概率理论以及概率分布方式。基于距离方法是用特征向量来表示文档(将文档看成一个点),通过计算点之间的距离,其中包括层次聚类法和平面划分法。

后面我或许会撰写具体的 Python 聚类算法。我之前已经讲过 VSM 计算相似度。并且,他的实验数据是搜狐中心的 10 个大类,像汽车、财经、IT、体育等。而我的数据都是旅游方面的。如何进一步对旅游数据进行聚类划分,比如山川、河流、博物馆等,这是另一个难点。
最后要说的还是那句话:不管怎样,期望文章能对你起到帮助作用。倘若文章存在错误或者不足之处,还请多多包涵。写文章不容易,你可以一边看一边进行分析。加油!!!
  (By:Eastmount 2015-12-11 深夜3点   )   

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

31阅读

外国教程python,python编程教学视频

2026年09月02日

25阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

26阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

22阅读