本发明属于文本信息处理领域,具体是涉及一种基于规则和语义的通用论坛主题帖页面信息抽取方法。
背景技术:
论坛的主题帖信息具有十分重要的价值。主题帖提供的信息远远大于论坛其他文本。数据分析师可以从海量论坛的主题帖中挖掘知识,分析网民的关注热点。论坛的页面信息采集一般通过网络信息采集器(也称网络爬虫)进行采集。采集到的页面一般利用Xpath,正则表达式,HTML解析等信息抽取规则进行匹配,进而抽取出论坛页面上的标题、正文、时间、作者等主贴信息。但是由于各个论坛的网页结构不同,一般需要对不同论坛设计不同的信息抽取规则,需要花费大量的人工成本。
本发明针对网络论坛的主题帖页面,基于规则和语义信息,结合正则表达式技术,提出并实现了一个自动获取主题帖信息的信息抽取方法和系统。此方法可以满足对论坛主贴信息的文本过滤和抽取,经过测试,可以获取超过50个不同类型的论坛信息,节省了人工设计成本,并保证准确率在合理的范围内。
技术实现要素:
本发明通过对比论坛结构和文本的共性,提供一种基于规则和语义的通用论坛主题帖页面信息抽取方法,用于对主题帖标题、作者、发帖时间和正文的抽取,该方法满足当今主流论坛的网页结构,克服传统爬虫需要针对不同网站分别设计而耗费的人工成本。
为实现上述目的,本发明采用如下的技术方案:
一种基于规则和语义的通用论坛主题帖页面信息抽取方法,包括以下步骤:
步骤(1)主题帖形式化表示
建立二元组B=(T,S),T表示主题帖,S表示帖子结构,T=(T1,T2,T3,T4),T1为标题,T2为发帖时间,T3为作者,T4为正文;S=(S1,S2),S1为由上至下结构,S2为由左至右的帖子结构;
步骤(2)定义文本特征和语义词典
步骤(2.1)获取论坛页面源码及文本
针对每个帖子获取其全部源码记为H;通过正则表达式过滤全部标签只保留文本,将过滤后只含有文本的源代码记为H’,每个网页记为一个二元组(H,H’),web上所有论坛的主题帖即为:
Page=((H1,H′1),(H2,H′2)(Hn,H′n))
步骤(2.2)计算文本间距离
获取一个H′中所有文本,文本之间的两两距离计算公式如下:
Dist(a,b)=Index(a)-Index(b)
其中,a,b是两种文本,Index(*)是文本首字索引,
步骤(2.3)计算URL相似性
获取一个H中所有URL,URL之间的两两相似性计算方法如下:
Sim(a,b)=len(MaxStr(a,b))
其中a,b是两种类型文本,MaxStr(a,b)是指a,b的最大公共子串,若Sim>M则认为a,b具有相似性,否则不具有相似性,M为相似性阈值,
步骤(2.4)构建噪声词典
1、获取相同论坛的不同帖子J个,对这J个H′的每一行进行词频/句频统计。取词/句频最高的P个词/句构成噪声集,P为频数阈值,
2、H中含有超链接且长度小于K的文本加入噪声集,K为文本长度阈值,该集合定义为NF,每类论坛有且仅有一个NF集。
步骤(2.5)构建指示词典
初始化指示词典:将初始的指示词典定义为空集,
该集合定义为F,F的结构如下所示:
F=(T1:*,T2:*,T3:*,T4:*}
每个论坛有且仅有一个F集,
步骤(3)提取标题(T1)、时间(T2)、作者(T3)
步骤(3.1)提取标题(T1),其规则如下:
规则1:根据指示词典获取标题
规则2:根据Dom源码获取标题
规则3:根据过滤噪声获取标题
步骤(3.2)获取时间(T2),其规则如下:
规则1:根据指示词典获取时间,
规则2:根据正则表达式获取时间,
步骤(3.3)获取作者(T3),其规则如下:
规则1:根据指示词典获取作者,
规则2:根据Dom源码及正则表达式获取作者,
规则3:根据URL相似性获取作者,
规则4:根据过滤噪声获取作者,
步骤(4):获取T4
论坛通用结构如下所示:
1.主题帖外部结构
标题(主题帖标题)→主题帖→回复贴1→回复贴2→……→回复贴N,
2.主题帖内部结构
S1型主题帖内部结构
标题→作者时间正文,时间作者正文三个标签在DOM中互为兄弟节点,
S2型主题帖内部结构
标题→作者→时间正文,时间正文标签互为兄弟节点,
针对不同结构提取正文片断方法详述如下:
步骤(4.1)判断论坛结构
论坛结构为由上至下则作者与时间的文本距离小于等于Maxdist;论坛结构为由左至右则作者与时间的文本距离大于Maxdist。Maxdist是距离阈值,由此可以判断该论坛类型属于S1型还是S2型,
步骤(4.2)提取正文片段
步骤(4.2.1)针对由上至下型(S1)
1.扩充噪声集NF:这类论坛作者和时间通常会放在Dom树的同一个节点下,从作者所在节点,逐层遍历其父节点,若在两层父节点内发现时间,则把该父节点所包含的信息都加入噪声词,否则放弃寻找,
2.搜索正文片段:
规则1:不包含主题帖作者,标题,发帖时间的信息,如果文本含@符号,则作为正文片断,
规则2:不包含主题帖作者,标题,发帖时间的信息,且若去掉噪声集的词句、数字以及标点符号,剩余文本大于D个字,则保留作为正文片断。D为剩余字数阈值,
步骤(4.2.2)针对由左至右型(S2)
1.定位右栏:
S2类型的标签结构左栏为作者信息,右栏为发帖时间以及正文信息,以发帖时间为起点,依次查找其父节点是否包含作者名,重复此过程,直到查找到作者名,便可定位出右栏所对应的的根节点,
2.搜索正文片段:搜索正文片段方法与前者算法相同
规则1:不包含主题帖作者,标题,发帖时间的信息,如果文本含@符号,则作为正文片断,
规则2:不包含主题帖作者,标题,发帖时间的信息,且若去掉噪声集的词句、数字以及标点符号,剩余文本大于D个字,则保留作为正文片断,D为剩余字数阈值,
步骤(4.3)提取T4
两种论坛的正文片断提取结束,则可以提取正文全部内容,方法如下:
1.寻找正文片断的父节点直到包含发帖时间为止,
2.提取包含发帖时间节点的前一个节点的文本内容,
3.删除其中所有噪声集内的文本,
4.将剩余文本作为正文
步骤(4.4)扩充F
获取主题帖标题、时间、作者、正文后,若其对应标签前有词,且该词位于NF中,将该词对应加入F。
附图说明
图1为本发明的流程图;
图2天涯社区(S1型)示例;
图3哇哈论坛(S2型)示例。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步的详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
如图1所示,本发明提供一种基于规则和语义的通用论坛主题帖页面信息抽取方法,包括以下步骤:
步骤(1)对主题帖进行形式化表示
建立二元组B=(T,S),T表示主题帖,S表示帖子结构。其中T=(T1,T2,T3,T4),T1为标题,T2为发帖时间,T3为作者,T4为正文;S=(S1,S2),S1为由上至下结构,如猫扑、虎扑、天涯社区等;S2为由左至右的帖子结构如六维空间、17173论坛、哇哈论坛等。
步骤(2)定义文本特征和语义词典
步骤(2.1)获取论坛页面源码及文本
针对每个帖子获取其全部源码记为H;通过正则表达式过滤全部标签只保留文本,将过滤后只含有文本的源代码记为H’。由此,每个网页记为一个二元组(H,H’),web上所有论坛的主题帖即为:
Page=((H1,H'1),(H2,H'2)(HniH'n))
步骤(2.2)计算文本间距离
获取一个H′中所有文本,文本之间的两两距离计算公式如下:
Dist(a,b)=Index(a)-Index(b)
其中a,b是两种文本,Index(*)是文本首字索引。
步骤(2.3)计算URL相似性
获取一个H中所有URL,URL之间的两两相似性计算方法如下:
Sim(a,b)=len(MaxStr(a,b))
其中a,b是两种类型文本,MaxStr(a,b)是指a,b的最大公共子串,若Sim>M则认为a,b具有相似性,否则不具有相似性,M为相似性阈值。
步骤(2.4)构建噪声词典
1.获取相同论坛的不同帖子J个,对这J个H′的每一行进行词频(句频)统计。取词(句)频最高的P个词(句)构成噪声集,P为频数阈值。
2.H中含有超链接且长度小于K的文本加入噪声集,K为文本长度阈值。
该集合定义为NF,每类论坛有且仅有一个NF集。
步骤(2.5)构建指示词典
初始化指示词典:将初始的指示词典定义为空集。
该集合定义为F,F的结构如下所示:
F={T1:*,T2:*,T3:*,T4:*}
每个论坛有且仅有一个F集。可以人工初始化F使信息采集效果更精确。
步骤(3)提取标题(T1)、时间(T2)、作者(T3)
步骤(3.1)提取标题(T1)
规则1:根据指示词典获取标题
判断网页中是否出现F中的词句,若存在则直接获取在该词句出现位置后且文本距离最近的内容。否则使用2。
规则2:根据网页的DOM源码获取标题
文档对象模型(DocumentObjectModel,简称DOM),在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象的标准模型就称为DO搜索。H中源代码<head>标签下的<title>非空文本。否则,搜索源代码<body>标签下的<h1><h2><h3><title>的非空文本。否则使用3。
规则3:根据过滤噪声获取标题
H’中出现NF中的词句一律过滤。获取过滤后的H’中出现的第一个文本。
步骤(3.2)获取时间(T2)
规则1:根据指示词典获取时间,具体方法同上。否则使用2。
规则2:根据正则表达式获取时间
H’中时间具有较为统一的形式,通常会精确到分钟或秒。大多数论坛的时间表示均遵循一定规律:XXXX-XX-XX XX-XX-XX、X天(小时,分钟)前、前天、昨天等,设计正则表达式匹配:
[0-9]{2,4}[-年/][0-9]{1,2}[-月/][0-9]{1,2}日*[0-9]{1,2}:[0-9]{1,2}:*[0-9]{0,2}[今昨前1-9]*[天小分][时钟]*前**[0-9]{0,2}:*[0-9]{0,2}:*[0-9]{0,2}
为避免出现作者登陆时间、网页时间等,使用该方法需获取第一个出现在标题后的时间。
步骤(3.3)获取作者(T3)
规则1:根据指示词典获取作者,具体方法同上。否则使用2。
规则2:根据Dom源码及正则表达式获取作者
H中,作者的标签中通常含有英文author和username等。寻找标签名或属性包含正则表达式^auth|^us*e*r*_*name的标签,提取其文本内容。否则使用3。
规则3:根据URL相似性获取作者
H中,主题帖作者和回复帖作者,其URL有很多重叠部分,计算链接两两间的相似性。需满足如下规则:位于标题和时间之间,第一个具有相似性的链接对应的文本,不存在于NF中的文本作为主题帖作者。否则使用4。
规则4:根据过滤噪声获取作者
H’中出现NF中的词句一律过滤。过滤后,H’中位于标题和时间之间的文本作为作者,若该位置没有文本则将时间的后一个文本作为作者。
步骤4:获取T4
论坛存在不同种结构,通过分析,通用结构如下所示:
3.主题帖外部结构
标题(主题帖标题)→主题帖→回复贴1→回复贴2→……→回复贴N。
4.主题帖内部结构
S1型主题帖内部结构
标题→作者时间正文,时间作者正文三个标签在DOM中互为兄弟节点。
S2型主题帖内部结构
标题→作者→时间正文。时间正文标签互为兄弟节点。
针对不同结构提取正文片断方法略有不同,详述如下:
步骤(4.1)判断论坛结构
论坛结构为由上至下则作者与时间的文本距离小于等于Maxdist;论坛结构为由左至右则作者与时间的文本距离大于Maxdist。Maxdist是距离阈值。由此可以判断该论坛类型属于S1型还是S2型。
步骤(4.2)提取正文片段
步骤(4.2.1)针对由上至下型(S1)
3.扩充噪声集NF:这类论坛作者和时间通常会放在Dom树的同一个节点下,从作者所在节点,逐层遍历其父节点,若在两层父节点内发现时间,则把该父节点所包含的信息都加入噪声词,否则放弃寻找。
4.搜索正文片段:
规则1:不包含主题帖作者,标题,发帖时间的信息,如果文本含@符号,则作为正文片断。
规则2:不包含主题帖作者,标题,发帖时间的信息,且若去掉噪声集的词句、数字以及标点符号,剩余文本大于D个字,则保留作为正文片断。D为剩余字数阈值。
步骤(4.2.2)针对由左至右型(S2)
3.定位右栏:
S2类型的标签结构左栏为作者信息,因此作者名必定存在,右栏为发帖时间以及正文信息,因此以发帖时间为起点,依次查找其父节点是否包含作者名,重复此过程,直到查找到作者名,便可定位出右栏所对应的的根节点。
4.搜索正文片段:搜索正文片段方法与前者算法相同。
规则1:不包含主题帖作者,标题,发帖时间的信息,如果文本含@符号,
则作为正文片断。
规则2:不包含主题帖作者,标题,发帖时间的信息,且若去掉噪声集的词句、数字以及标点符号,剩余文本大于D个字,则保留作为正文片断。D为剩余字数阈值。
步骤(4.3)提取T4
两种论坛的正文片断提取结束,则可以提取正文全部内容。方法如下:
1.寻找正文片断的父节点直到包含发帖时间为止。
2.提取包含发帖时间节点的前一个节点的文本内容。
3.删除其中所有噪声集内的文本。
4.将剩余文本作为正文
步骤(4.4)扩充F
获取主题帖标题、时间、作者、正文后,若其对应标签前有词,且该词位于NF中,将该词对应加入F。
实施例1:
本发明提出的方法是依次按以下步骤实现的(以天涯社区和哇哈论坛为例,如图1、图2):
步骤(1)主题帖形式化表示
建立二元组B=(T,S),T表示主题帖,S表示帖子结构。其中T=(T1,T2,T3,T4);S=(S1,S2)。
步骤(2)定义文本特征和语义词典
步骤(2.1)获取论坛页面源码及文本
使用Python的urllib库针对每个帖子获取其全部源码记为H;通过正则表达式过滤全部标签只保留文本,将过滤后只含有文本的源代码记为H’。由此,将一个网页记为一个二元组(H,H’)。这两个帖子页面即为
Page=((H1,H′1),(H2,H′2))
步骤(2.2)计算文本间距离
获取一个H′中所有文本,计算文本之间的两两距离。
步骤(2.3)计算URL相似性
获取一个H中所有URL,计算URL之间的两两相似性,M相似性阈值取8。
步骤(2.4)构建噪声词典
获取相同论坛的不同帖子100个,对这100个H′的每一行进行词频(句频)统计。取词(句)频最高的P个词(句)构成噪声集,P取3,此时噪声词数远远大于3因为很多词句出现频数相同。
H中含有超链接且长度小于K的文本加入噪声集,K取5。
该集合定义为NF,每类论坛有且仅有一个NF集。如下表所示:
表1天涯社区和哇哈论坛的NF集
步骤(2.5)构建指示词典
初始化指示词典:将初始的指示词典定义为空集。
该集合定义为F,每个论坛有且仅有一个F集。
步骤(3)提取标题(T1)、时间(T2)、作者(T3)
步骤(3.1)提取标题(T1)
天涯社区跟据规则2:
在小县城置换了一套房子,买完以后,心里有点发虚,上来问问大家的意见
哇哈论坛根据规则2:
2016年11月3日欧冠波尔图vs布鲁日[其他荷兰语]
步骤(3.2)获取时间(T2)
天涯社区根据规则2:
2017-11-14 09:35:11
哇哈论坛根据规则2:
2016-11-3 20:54
步骤(3.3)获取作者(T3)
天涯社区根据规则3:
表2天涯社区相似URL和对应的文本
根据规则,要求必须处于标题与时间之间的第一个URL对应的文本作为作者,作者为啮缺。
哇哈论坛同理,根据规则3:
表3哇哈论坛相似URL和对应的文本
作者为阿聰。
步骤4:获取T4
步骤(4.1)判断论坛结构
论坛结构为由上至下则作者与时间的文本距离小于等于Maxdist;论坛结构为由左至右则作者与时间的文本距离大于Maxdist。Maxdist取40。
在之前的计算中已经得到标题、时间、作者和部分文本之间的距离,天涯社区和哇哈论坛的文本距离结果如下所示:
表4天涯社区和哇哈论坛的文本距离
由表4可以看出,根据作者-时间的距离阈值划分可以快速得到论坛结构是属于S1还是S2。
步骤(4.2)提取正文片段
步骤(4.2.1)针对由上至下型(S1)天涯社区
扩充噪声集NF:定位天涯社区作者节点和时间节点内的所有信息,将这些信息加入到NF中。
搜索正文片段:
通过规则2,搜素到天涯社区的正文片段。
步骤(4.2.2)针对由左至右型(S2)哇哈论坛
定位右栏:
通过时间节点向上回溯,回溯过程为时间节点→包含正文的节点→
包含作者的节点→停止。获取包含作者的节点的上一个节点,即包含正文的节点。
搜索正文片段:
通过规则2搜索到哇哈论坛的正文片段
步骤(4.3)提取T4
两种论坛的正文片断提取结束,提取正文全部内容。
正文片段→包含正文片段的节点→提取该节点文本→删除该节点内所有噪声集内容→得到正文。
步骤(4.4)扩充F
获取主题帖标题、时间、作者、正文后,若其对应标签前有词,且该词位于NF中,将该词对应加入F。
更新之后的F变为:
表5哇哈论坛的F
表6天涯社区的F
之后可以直接使用指示词典F进行信息抽取。有些词句可能没有语义关联性,但是在这些语句出现后会出现所需要的文本。
步骤(5)算法分析
本发明充分考虑了算法中的通用性。在测试中对于50个不同种类的论坛,对本发明算法测试结果进行分类讨论:
1.完全正确:获取的T1,T2,T3,T4完全正确
2.部分正确:获取出T1,T2,T3,T4的部分内容,算法的逻辑结构正确,定位正确,细节出现问题。
3.失败:定位不准确,造成逻辑混乱。
表7 50个论坛的测试结果
表7是针对50个不同的论坛进行测试的结果,其中40个测试结果完全正确,不需要更改,3个结果定位准确,但是需要加入更细节的规则,7个结果失败。7个失败的结果主要原因是超出S1,S2两种结构,这些结构不容易进行总结,不具通用性。针对S1,S2两种格式的论坛,准确率为93%。
表8人工初始化50个指示词典的测试结果
表8是针对人工设置了指示词,即取得待获取数据前最近的文本作为指导,构建指示词典F,通过这种方式获取的信息完全根据文本的顺序而不必分析Dom结构,因而取得了较高的准确率。