这是我试图将论文写作进行自动化处理的一个记录,这是开始的第一篇,根据已经写好的脚注进行参考文献的添加,使得自己不用一个一个的复制脚注到参考文献中去。在设想中不仅进行论文格式处理,如参考文献的自动添加、标题与正文字号的批量处理、脚注自动添加等形式上的问题,可能更进一步涉及实质内容例如提供词向量对可能导致文章重复率计算的的词语替换乃至使用GPT-2,GPT-3自动化写作
通过脚注生成参考文献
python-docx包中没有发现可以读取脚注的方法,而在csdn中也没有找到,关于脚注的提取大多都是将docx文件转为html后进行提取的,因而我也是采取这种路径
mammoth可以将docx转为html即
转化过程为:
import mammoth
def docx_html(input):
"""这是由于脚注无法读取"""
"""转为html"""
with open(input, "rb") as docx_file:
result = mammoth.convert_to_html(docx_file)
html = result.value # The generated HTML
temp = self.input.split(".")[0]+".html"
with open(temp, "a")as f:
f.write(html)
return temp
return temp 返回的是转化后的html的路径
这里比较简单,导入lxml,然后进行xpath提取即可
temp = docx_html(input)
parser = etree.HTMLParser(encoding="gbk")
text = etree.parse(temp, parser=parser)
content = text.xpath("/html/body/ol[10]//text()")
#print(content)
references = []
for i in content:
if i == "↑" or "说明:" in i:
pass
else:
try:
text = i.split(";")
for i in text:
references.append(i.replace("参见",""))
except:
references.append(i.replace("参见", ""))
这里的提取信息的标签会因为文章的长度而不同,需要自行调整;而需要剔除的内容也会由于每个人的写作习惯不同而需要调整
#写入docx
document = docx.Document(self.input)
docText2 = [paragraph.text for paragraph in document.paragraphs]
p = document.paragraphs[len(docText2)-1]
#document.add_page_break() # 另起一页
p.add_run("\n")
p.add_run("参考文献\n")
for i,text in enumerate(references):
i = i+1
p.add_run("[%d]"%i+text+"\n")
document.save(self.input)
这里有个不太完善的地方就是“参考文献”无法使用add_heading的方法插入,只能以段落文本的方式插入,这导致参考文献需要自行调整字号以及加粗
class Reference_Find():
def __init__(self,input):
self.input = input
def docx_html(self):
"""这是由于脚注无法读取"""
"""转为html"""
with open(self.input, "rb") as docx_file:
result = mammoth.convert_to_html(docx_file)
html = result.value # The generated HTML
#messages = result.messages # Any messages, such as warnings during conversion
temp = self.input.split(".")[0]+".html"
with open(temp, "a")as f:
f.write(html)
return temp
def references_write_to_docx(self):
"""首先提取脚注,然后写入"""
temp = self.docx_html()
print(temp)
parser = etree.HTMLParser(encoding="gbk")
text = etree.parse(temp, parser=parser)
content = text.xpath("/html/body/ol[10]//text()")
#print(content)
references = []
for i in content:
if i == "↑" or "说明:" in i:
pass
else:
try:
text = i.split(";")
for i in text:
references.append(i.replace("参见",""))
except:
references.append(i.replace("参见", ""))
#写入docx
document = docx.Document(self.input)
docText2 = [paragraph.text for paragraph in document.paragraphs]
p = document.paragraphs[len(docText2)-1]
#document.add_page_break() # 另起一页
p.add_run("\n")
p.add_run("参考文献\n")
for i,text in enumerate(references):
i = i+1
p.add_run("[%d]"%i+text+"\n")
document.save(self.input)
项目地址 参考文献自动添加.