以下讲的生成摘要方式均为抽取式, 并且实质仍是抽取文章前 N 个字, 真正的抽取式通常会使用 TextRank 算法计算文章中的句子权重高的再抽取句子, 更非生成式,生成式摘要需要依靠机器学习的帮助.
方式一: 直接取 Markdown 文字的前100个字(不推荐)
这种简单粗暴的方式很不友好, 如果开头是一张图片或者是链接, 那么用户可能只看到链接, 体验感很差.
方式二: 使用正则去掉Markdown (有门槛)
通过研究 Markdown 语法, 然后用正则表达式去除即可.
注意此处的 re.sub
函数, 其参数展开应该是 re.sub(pattern, repl, string, count=0, flags=0)
, 也就是说下面代码的含义是: 检测到 article.body
中符合 pattern
规则的字符串, 则用空字符串(''
代表空字符串) 代替符合规则的字符串.
补充一点正则表达式的知识, 以本文中的正则表达式为例:
\[(.*?)\]\(.*?\)
先匹配一个中括号[]
. 因为\[\]
中的斜杆会让原本匹配中括号表达式转义为匹配一个中括号.
然后开始匹配()
内的子表达式 .*?
点.
匹配除换行符 \n 之外的任何单字符, 星号*
匹配前面的子表达式零次或多次, 问号?
则表示匹配前面的子表达式一次或零次
整个表达式的意思就是匹配 Markdown 语法中的链接 []()
括号内的字符为任意长度, 零或一或无限多个非回车的字符均可. 笔者进行了测试, 证明这个表达式是可行的.
import re
content = re.sub(r'\[(.*?)\]\(.*?\)', '', article.body)
pattern = r'[*#>`-]'
article.body = re.sub(pattern, '', content)
方式三: 转换为 HTML, 再用过滤器去掉HTML标签 (推荐)
Django 内置了过滤器, 引入后即可清除 HTML 标签(当然, 你也可以用正则表达式过滤)
from django.utils.html import strip_tags
article.body = strip_tags(markdown.markdown(article.body))
方式四: 使用 Xpath 的 String()
方法 (推荐)
Xpath 的 string()
方法常可用于爬取网页时提取网页的纯文本, 依据这个思路也可以用来提取 Markdown 文字的纯文本.
from lxml import etree
html = markdown.markdown(article.body)
content = etree.HTML(html)
article.body = content.xpath('string()')
article.body = markdown.markdown(article.body)
欢迎关注公众号: 程序员的碎碎念
我的个人博客: feson.tech