我想让团队成员帮我抽取了几千条的博客文章数据,存在临时的数据库中,然后我尝试着进行处理,等我真正的处理成功之后,在集成到正式的环境中,进行博客内容的抽取工作。
博客文章的清洗
抽取到的文章携带了大量的html标签,我们需要返回没有html标签的纯文本,所以需要进行数据的清洗
(1)第一次尝试,使用正则表达式提取相关标签中的信息
但是效果并不好,会提取到字标签中的内容,比如文章里有代码,p标签里就会携带code标签,发现很多文本里面携带了代码。
(2)想办法将代码剔除,使用正则表达式,可以将文本中的字母和特殊字符剔除掉,只保留下中文文本
但是会将文本中有意义的单词剔除掉,而且文本的标点符号会丧失,可读性大大的减少
public static String htmlRemoveTag(String inputString) {
if (inputString == null)
return null;
String htmlStr = inputString; // 含html标签的字符串
String textStr = "";
java.util.regex.Pattern p_script;
java.util.regex.Matcher m_script;
java.util.regex.Pattern p_style;
java.util.regex.Matcher m_style;
java.util.regex.Pattern p_html;
java.util.regex.Matcher m_html;
try {
//定义script的正则表达式{或<script[^>]*?>[\\s\\S]*?<\\/script>
String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>";
//定义style的正则表达式{或<style[^>]*?>[\\s\\S]*?<\\/style>
String regEx_style = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>";
String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式
p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
m_script = p_script.matcher(htmlStr);
htmlStr = m_script.replaceAll(""); // 过滤script标签
p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
m_style = p_style.matcher(htmlStr);
htmlStr = m_style.replaceAll(""); // 过滤style标签
p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
m_html = p_html.matcher(htmlStr);
htmlStr = m_html.replaceAll(""); // 过滤html标签
textStr = htmlStr;
String after = textStr.replaceAll("[a-zA-z0-9<>$&^*%\t\n: /=\"',.{}~()\0_]","");
textStr = after;
} catch (Exception e) {
e.printStackTrace();
}
return textStr;// 返回文本字符串
}
(3)最后找到了java爬虫经常使用的Jsoup来解析html文档,他可以提取出所需要标签的内容,经过观察发现,有用的文本都在p标签和h标签中,是需要用jsoup进行解析,然后输出对应标签的内容即可。这样既不会丢失文本信息,也不会混杂入代码等无用信息,虽然可能其他标签中还有少量文字,如tr,table,li,但是主要的内容基本已经提取出来了。
public class GetCleanedContent {
private Document document;
private String html = "";
public GetCleanedContent(String html) {
this.html = html;
document = Jsoup.parse(html);
}
private String getPs() {
//获得所有p标签
Elements links = document.getElementsByTag("p");
//实例化stringbuffer
StringBuffer buffer = new StringBuffer();
for (Element link : links) {
//将文本提前出来
buffer.append(link.text().trim());
}
return buffer.toString().trim();
}
private String getHs() {
Elements links = document.getElementsByTag("h1");
StringBuffer buffer = new StringBuffer();
for (Element link : links) {
buffer.append(link.text().trim());
}
links = document.getElementsByTag("h2");
buffer = new StringBuffer();
for (Element link : links) {
buffer.append(link.text().trim());
}
links = document.getElementsByTag("h3");
buffer = new StringBuffer();
for (Element link : links) {
buffer.append(link.text().trim());
}
links = document.getElementsByTag("h4");
buffer = new StringBuffer();
for (Element link : links) {
buffer.append(link.text().trim());
}
links = document.getElementsByTag("h5");
buffer = new StringBuffer();
for (Element link : links) {
buffer.append(link.text().trim());
}
links = document.getElementsByTag("h6");
buffer = new StringBuffer();
for (Element link : links) {
buffer.append(link.text().trim());
}
return buffer.toString().trim();
}
private String getTrs() {
Elements links = document.getElementsByTag("tr");
StringBuffer buffer = new StringBuffer();
for (Element link : links) {
buffer.append(link.text().trim());
}
return buffer.toString().trim();
}
private String getDivs() {
Elements links = document.getElementsByTag("div");
StringBuffer buffer = new StringBuffer();
for (Element link : links) {
buffer.append(link.text().trim());
}
return buffer.toString().trim();
}
private String getLis() {
Elements links = document.getElementsByTag("li");
StringBuffer buffer = new StringBuffer();
for (Element link : links) {
buffer.append(link.text().trim());
}
return buffer.toString().trim();
}
public String parse() {
String result = "";
result += getPs();
// result +=getDivs();
result +=getHs();
// result+=getLis();
// result +=getTrs();
return result;
}
}
博客摘要的抽取
昨天实现了textRank算法,今天在训练seq2seq的模型,先使用textrank生成一个摘要尝试一下,等模型训练好之后在尝试生成试摘要。
使用得是昨天实现的textrank算法,效果如下:
未完待续~ 还有最重要的博客标签和分类没有进行抽取。