① 如何提取正文内容 BeautifulSoup的输出
创建一个新网站,一开始没有内容,通常需要抓取其他人的网页内容,一般的操作步骤如下:
根据url下载网页内容,针对每个网页的html结构特征,利用正则表达式,或者其他的方式,做文本解析,提取出想要的正文。
为每个网页写特征分析这个还是太耗费开发的时间,我的思路是这样的。
python的BeautifulSoup包大家都知道吧,
import BeautifulSoupsoup = BeautifulSoup.BeautifulSoup(html)
利用这个包先把html里script,style给清理了:
[script.extract() for script in soup.findAll('script')][style.extract() for style in soup.findAll('style')]
清理完成后,这个包有一个prettify()函数,把代码格式给搞的标准一些:
soup.prettify()
然后用正则表达式,把所有的HTML标签全部清理了:
reg1 = re.compile("<[^>]*>")content = reg1.sub('',soup.prettify())
剩下的都是纯文本的文件了,通常是一行行的,把空白行给排除了,这样就会知道总计有多少行,每行的字符数有多少,我用excel搞了一些每行字符数的统计,如下图:
x坐标为行数,y坐标为该行的字符数
很明显,会有一个峰值,81~91行就应该是这个网页的正文部分。我只需要提取81~91行的文字就行了。
问题来了,照着这个思路,有什么好的算法能够通过数据分析的方式统计出长文本的峰值在哪几行?
BeautifulSoup不仅仅只是可以查找,定位和修改文档内容,同样也可以用一个好的 格式进行输出显示。BeautifulSoup可以处理不同类型的输出:
格式化的输出
非格式化的输出
格式化输出
BeautifulSoup中有内置的方法prettfy()来实现格式化输出。比如:
view plain print ?
frombs4importBeautifulSoup
html_markup=“””<pclass=”eramid”>
<ulid=”procers”>
<liclass=”procerlist”>
<divclass=”name”>plants</div>
<divclass=”number”>100000</div>
</li>
<liclass=”procerlist”>
<divclass=”name”>algae</div>
OutputinBeautifulSoup
<divclass=”number”>100000</div>
</li>
</ul>”””
soup=BeautifulSoup(html_markup,“lxml”)
print(soup.prettify())
② 文本抽取式摘要
关键词:抽取式,BM25算法,行业知识后处理。
背景
笔者所在的公司原来已经有一个自动摘要的模块,我只是在原来的基础上,做了些针对特定领域的优化。
首先自动文本摘要大概分为 抽取式和生成式两类。抽取式摘要主要是直接抽取输入文本的几句话来概括整段的内容,这个实现相对简单(常用算法 TextRank、TF-IDF 等,本文使用的是 BM25 算法)。另一种是生成式,生成式的构成比较复杂,实现难度也很大,效果在实际落地过程中也并不理想。所以下文主要是针对抽取式自动摘要来讨论的。
问题的算法抽象
首先抽取式摘要,问题可以归结为从文章中选取和其他句子最相关的那句话。也就是将每句话当成“搜索框”里输入的句子,然后计算其他句子和他的相关度得分,然后选取和其他句子相关性得分最高的那句话作为摘要。
BM25算法:
首先BM25算法在搜索引擎领域是很有用的。这里关于BM25解析,讲的很好的文章: BM25 - ywl925 - 博客园 。这里就不展开介绍了。
BM25算法得分的归一化
经过BM25算法计算的得分,范围相差会很大,笔者为了实现后面的静态加分,先对BM25算的score进行了一个归一化。归一化一般最常见的两种: Min-Max和Z score,是相对常见的概念。可以参考博客: 数据归一化和两种常用的归一化方法 - ChaoSimple - 博客园
特定领域知识的积累
这里明确一下,这里所说的领域知识,主要是某些很有区分度的词和短语。这里涉及的底层模块也比较多。
首先是特定领域的语料库的积累。
以中文为例,除了一些公开的语料库,我们还需要一些扩充一些专门领域的语料。并对他们进行标注。
然后相应的,分词模块也要增强。
特别是针对那些领域专有的名词。由于现在中文分词的技术已经比较成熟,所以这块相对来说挑战不是很大。而且这面即使是基于HMM或者CRF做的分词,都已经有很可观的实用表现,和相当的泛化。不过如果能把底层的分词的模块性能和准确率提升一点,也会有很大的帮助,毕竟在中文文本处理中,分词是第一步要做的基础操作。
行业知识静态加分
这里的实现目前还是比较粗糙的。首先总结每个行业有区分度的词。这个词的获取会上面提到的特定的行业语料库,以及针对这个领域的分词。
在句子计算BM25得分,并归一化后,这里判断句子里面是否有领域关键词,如果有领域关键词,则静态的给归一化后的BM25 分数加一个静值。 之后对各个句子,按照这个新的分数排序。抽取得分最高的那句话。
这里还有一个问题可以深挖,就是笔者目前实现的领域知识加分,是在已经预先分好了分类的前提下,也就是说传入的参数,除了原文还会有属于哪个领域的具体信息。如果这个领域分类信息没有提前获得,那么就需要对整段文字做一个大概的分类,这样的难度就会大增。我们后续可以继续讨论这种情况。
③ Web文档是什么
Web文档就是网页,是构成网站的基本元素,是承载各种网站应用的平台。通俗地说,您的网站就是由网页组成的,如果您只有域名和虚拟主机而没有制作任何网页的话,您的客户仍旧无法访问您的网站。
④ 文本特征提取
在对文本数据进行处理时,很大一部分精力都用在数据集的特征提取上,因此记录一下常用的文本特征提取方法。
文本特征提取一般分为两部分
(1)文本本身属性:元音字数数、辅音字母数、···
(2)基于文本的特征提取:TF-IDF等
比如提取以上文档的特征,基于文本本身可以提取特征:
(1)字数:统计每一行text文本的词汇数量(有多少个单词)
(2)非重复单词数量:统计每一行text文本中只出现一次的单词个数
(3)长度:每一行text的长度,占了多少存储空间(包含空格、符号、字母等的长度)
(4)停止词数量统计:between、but、about、very等词汇的数量统计
(5)标点符号数量:每一行text中包含的标点符号数量
(6)大写单词数量:统计大写单词数量
(7)标题式单词数量:统计单词拼写首字母是否为大写,且其他字母为小写的单词数量
(8)单词的平均长度:每一行text中每个单词长度的平均值
这些特征的提取不涉及复杂的函数计算,基于文本本身属性提取直观信息作为模型训练的特征。
·
TF-IDF算法 :计算单词权重最为有效的实现方法就是TF-IDF, 它是由Salton在1988 年提出的,以特征词在文档d中出现的次数与包含该特征词的文档数之比作为该词的权重。
python中使用TfidfVectorizer函数实现TF-IDF特征的提取,生成每个text的TF-IDF特征。
·
经过TF-IDF特征提取后,数据集的特征变量超级多(TF-IDF计算了整个数据集出现的所有单词对每个test的权重),面对这样庞大的特征数据,可以通过SVD实现对数据集的压缩。
SVD的原理是将庞大的TF-IDF生成的数据集A进行拆分,设置K值(想要压缩得到的维度,例如K=20,压缩后得到20列的特征数据集)X就是只有K个特征转换后的数据集。
经过压缩后的TF-IDF只有K列,与01中 基于文本本身特征 合并,即为文本数据集的特征向量。
⑤ galgame的文本一般怎么提取
galgame的cg可以提取
下载个crass软件,打开软件,指定源文件打上勾,点【浏览】找到.ypf【有时格式也可能是..PAK、.ARC、.AR】的文件。
.ypf有可能在pac文件夹里,有些游戏是Data文件夹里,有些直接在根目录里,点击执行即可提取crass软件可以自己下载也可以在追问中留邮。
基于TextRank的游戏文本提取
TextRank算法的思想直接借鉴了PageRank网页排序算法,使用在K长度窗口中词的相邻关系来代表PR算法中的链接指向关系,与PageRank的迭代公式完全相同,基于TextRank的方法简单有效,速度也在可接受的范围内。但这一方法存在两个较为明显的不足:
1、关键词的来源有限,仅为本篇文档所有词汇的集合,难以学习到更多的关键词表示,也无法以“生成”的方式得到文章抽象的关键词表述。
2、虽然TextRank考虑了关键词在给定距离窗口的共现等信息,但实际上仍然偏向于给高频词以更高的权重,所以在实际使用中与TF-IDF这类方法相比没有太大的优势。
⑥ 如何使用爬虫做一个网站
做法:传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。
然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。
⑦ 网页需要登录,怎样抓取其内容
网站登录/认证有多种方式,要抽取/提取需要登录的网页内容,需要实现有针对性的网页抓取软件模块:
1,HTTPS
2,HTTP Digest
3,HTTP Basic
4,使用网页Form
其中,前三种是通信协议层面的,如果使用PHP,Python,Javascript, Java等语言编程,一般需要控制HTTP通信做相应的动作;而第四种是应用层面的,只需要模拟用户填写Form然后提交即可,相对容易一些。另外,还要考虑服务器是否推送cookie以及会话控制等等,所以,要自己编程把所有的都实现了是一个很大的挑战,但是,如果利用浏览器平台能力,这个就好解决了,例如,利用Firefox的安全管理器,网站认证都委托给Firefox,只需要编写应用逻辑代码即可。网页抓取/数据抽取/信息提取软件工具包MetaSeeker就是采用了这种方案,用统一的方法实现所有方式的认证,一种最简单的操作方法:先访问一次目标页面,认证通过后安全信息都记录在安全服务器上,后续的抓取工作就像针对不需要认证的页面一样,当然,这个第一次认证操作可以用程序自动完成。
MetaSeeker工具包是免费使用的,下载地址: http://www.gooseeker.com
⑧ sparse autoencouder算法怎么自动提取文本特征
深度优先在很多情况下会导致爬虫的陷入(trapped)问题,目前常见的是广度优先和很大程度上借用了文本检索的技术。文本分析算法可以快速有效的对网页进行分类
⑨ c语言怎么提取文本文件中我想要的一些信息
使用文件操作函数fscanf即可提取文本当中特定的信息。例如要提取一个整数,可以用fscanf(fp,"%d",&n);要提取一个字符串可以用fscanf(fp,"%s",s),其中fp为文件指针。
1、C语言标准库提供了一系列文件操作函数。文件操作函数一般以f+单词的形式来命名(f是file的简写),其声明位于stdio.h头文件当中。例如:fopen、fclose函数用于文件打开与关闭;fscanf、fgets函数用于文件读取;fprintf、fputs函数用于文件写入;ftell、fseek函数用于文件操作位置的获取与设置。
2、例程:
#include<stdio.h>
inta;
charb,c[100];
intmain(){
FILE*fp1=fopen("input.txt","r");//打开输入文件
FILE*fp2=fopen("output.txt","w");//打开输出文件
if(fp1==NULL||fp2==NULL){//若打开文件失败则退出
puts("不能打开文件!");
return0;
}
fscanf(fp1,"%d",&a);//从输入文件读取一个整数
b=fgetc(fp1);//从输入文件读取一个字符
fgets(c,100,fp1);//从输入文件读取一行字符串
printf("%ld",ftell(fp1));//输出fp1指针当前位置相对于文件首的偏移字节数
fputs(c,fp2);//向输出文件写入一行字符串
fputc(b,fp2);//向输出文件写入一个字符
fprintf(fp2,"%d",a);//向输出文件写入一个整数
fclose(fp1);//关闭输入文件
fclose(fp2);//关闭输出文件,相当于保存
return0;
}
⑩ 网页正文及内容图片提取算法
备份自: http://blog.rainy.im/2015/09/02/web-content-and-main-image-extractor/
问题: 如何提取任意(尤其是新闻、资讯类)网页的正文内容,提取与文章内容相关的图片,源码可见: extractor.py 。
抓取单个网站网页内容时通常采用正则匹配的方式,但不同网站之间结构千奇百怪,很难用统一的正则表达式进行匹配。 《基于行块分布函数的通用网页正文抽取算法》 的作者总结了一般从网页中提取文章正文的方法,提出基于行块分布的正文抽取算法,并给出了 PHP 、Java 等实现。这一算法的主要原理基于两点:
算法步骤如下:
以上算法基本可以应对大部分(中文)网页正文的提取,针对有些网站正文图片多于文字的情况,可以采用保留 <img> 标签中图片链接的方法,增加正文密度。目前少量测试发现的问题有:1)文章分页或动态加载的网页;2)评论长度过长喧宾夺主的网页。