####一. Selenium爬取百度百科摘要
简单给出Selenium爬取百度百科5A级景区的代码:
# coding=utf-8
import time
import re
import os
import sys
import codecs
import shutil
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import selenium.webdriver.support.ui as ui
from selenium.webdriver.common.action_chains import ActionChains
'''
遇到不懂的问题?Python学习交流群:1136201545
满足你的需求,资料都已经上传群文件,可以自行下载!
'''
#Open PhantomJS
driver = webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe")
#driver = webdriver.Firefox()
wait = ui.WebDriverWait(driver,10)
#Get the Content of 5A tourist spots
def getInfobox(entityName, fileName):
try:
#create paths and txt files
print u'文件名称: ', fileName
info = codecs.open(fileName, 'w', 'utf-8')
#locate input notice: 1.visit url by unicode 2.write files
#Error: Message: Element not found in the cache -
# Perhaps the page has changed since it was looked up
#解决方法: 使用Selenium和Phantomjs
print u'实体名称: ', entityName.rstrip('\n')
driver.get("http://baike.baidu.com/")
elem_inp = driver.find_element_by_xpath("//form[@id='searchForm']/input")
elem_inp.send_keys(entityName)
elem_inp.send_keys(Keys.RETURN)
info.write(entityName.rstrip('\n')+'\r\n') #codecs不支持'\n'换行
#load content 摘要
elem_value = driver.find_elements_by_xpath("//div[@class='lemma-summary']/div")
for value in elem_value:
print value.text
info.writelines(value.text + '\r\n')
#爬取文本信息
#爬取所有段落<div class='para'>的内容 class='para-title'为标题 [省略]
time.sleep(2)
except Exception,e: #'utf8' codec can't decode byte
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)
source = open("Tourist_spots_5A_BD.txt", 'r')
num = 1
for entityName in source:
entityName = unicode(entityName, "utf-8")
if u'故宫' in entityName: #else add a '?'
entityName = u'北京故宫'
name = "%04d" % num
fileName = path + str(name) + ".txt"
getInfobox(entityName, fileName)
num = num + 1
print 'End Read Files!'
source.close()
driver.close()
if __name__ == '__main__':
main()
内容如下图所示,共204个国家5A级景点的摘要信息。这里就不再叙述:
####二. Jieba中文分词
#encoding=utf-8
import jieba
#全模式
text = "我来到北京清华大学"
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(text)
print u"[默认模式]: ", "/ ".join(seg_list)
#新词识别 “杭研”并没有在词典中,但是也被Viterbi算法识别出来了
seg_list = jieba.cut("他来到了网易杭研大厦")
print u"[新词识别]: ", "/ ".join(seg_list)
#搜索引擎模式
seg_list = jieba.cut_for_search(text)
print u"[搜索引擎模式]: ", "/ ".join(seg_list)
输出如下图所示:
2.添加自定义词典
#encoding=utf-8
import jieba
#导入自定义词典
jieba.load_userdict("dict.txt")
#全模式
text = "故宫的著名景点包括乾清宫、太和殿和黄琉璃瓦等"
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.关键词提取
#encoding=utf-8
import jieba
import jieba.analyse
#导入自定义词典
jieba.load_userdict("dict.txt")
#精确模式
text = "故宫的著名景点包括乾清宫、太和殿和午门等。其中乾清宫非常精美,午门是紫禁城的正门,午门居中向阳。"
seg_list = jieba.cut(text, cut_all=False)
print u"分词结果:"
print "/".join(seg_list)
#获取关键词
tags = jieba.analyse.extract_tags(text, topK=3)
print u"关键词:"
print " ".join(tags)
输出结果如下,其中"午门"出现3次、"乾清宫"出现2次、"著名景点"出现1次,按照顺序输出提取的关键词。如果topK=5,则输出:“午门 乾清宫 著名景点 太和殿 向阳”。
>>>
分词结果:
故宫/的/著名景点/包括/乾清宫/、/太和殿/和/午门/等/。/其中/乾清宫/非常/精美/,/午门/是/紫禁城/的/正门/,/午门/居中/向阳/。
关键词:
午门 乾清宫 著名景点
>>>
4.对百度百科获取摘要分词
从BaiduSpider文件中读取0001.txt~0204.txt文件,分别进行分词处理再保存。
#encoding=utf-8
import sys
import re
import codecs
import os
import shutil
import jieba
import jieba.analyse
'''
遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
'''
#导入自定义词典
jieba.load_userdict("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 = "%04d" % 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.去除停用词
#encoding=utf-8
import jieba
#去除停用词
stopwords = {}.fromkeys(['的', '包括', '等', '是'])
text = "故宫的著名景点包括乾清宫、太和殿和午门等。其中乾清宫非常精美,午门是紫禁城的正门。"
segs = jieba.cut(text, cut_all=False)
final = ''
for seg in segs:
seg = seg.encode('utf-8')
if seg not in stopwords:
final += seg
print final
#输出:故宫著名景点乾清宫、太和殿和午门。其中乾清宫非常精美,午门紫禁城正门。
seg_list = jieba.cut(final, cut_all=False)
print "/ ".join(seg_list)
#输出:故宫/ 著名景点/ 乾清宫/ 、/ 太和殿/ 和/ 午门/ 。/ 其中/ 乾清宫/ 非常/ 精美/ ,/ 午门/ 紫禁城/ 正门/ 。
三. 基于VSM的文本聚类算法
这部分主要参考2008年上海交通大学姚清坛等《基于向量空间模型的文本聚类算法》的论文,因为我的实体对齐使用InfoBox存在很多问题,发现对齐中会用到文本内容及聚类算法,所以简单讲述下文章一些知识。
文本聚类的主要依据聚类假设是:同类的文档相似度较大,而非同类文档相似度较小。同时使用无监督学习方法,聚类不需要训练过程以及不需要预先对文档手工标注类别,因此具有较高的灵活性和自动化处理能力。主要分为以下部分:
(1) 预处理常用方法
文本信息预处理(词性标注、语义标注),构建统计词典,对文本进行词条切分,完成文本信息的分词过程。
(2) 文本信息的特征表示
采用方法包括布尔逻辑型、概率型、混合型和向量空间模型。其中向量空间模型VSM(Vector Space Model)是将文档映射成向量的形式,(T1, T2, ..., Tn)表示文档词条,(W1, W2, ..., Wn)文档词条对应权重。建立文本特征主要用特征项或词条来表示目标文本信息,构造评价函数来表示词条权重,尽最大限度区别不同的文档。
(3) 文本信息特征缩减
VSM文档特征向量维数众多。因此,在文本进行聚类之前,应用文本信息特征集进行缩减,针对每个特征词的权重排序,选取最佳特征,包括TF-IDF。推荐向量稀疏表示方法,提升聚类的效果,其中(D1, D2, ..., Dn)表示权重不为0的特征词条。
(4) 文本聚类
文本内容表示成数学课分析形势后,接下来就是在此数学基础上进行文本聚类。包括基于概率方法和基于距离方法。其中基于概率是利用贝叶斯概率理论,概率分布方式;基于聚类是特征向量表示文档(文档看成一个点),通过计算点之间的距离,包括层次聚类法和平面划分法。