快捷搜索:  汽车  科技

适合小白训练的python网站(研究了一个论文的模块识别办法)

适合小白训练的python网站(研究了一个论文的模块识别办法)整个需求中,难点其实是模块的识别,具体是,不清楚某些模块是否一定会有,各个模块的前后顺序不确定。经过几天的研究,找到了一套识别的逻辑,大大优化了模块识别的准确性。处理的逻辑如下:格式方面,可以使用win32com来调整,只需要熟悉微软的文档就可以使用了,再不济还可以参考word的宏。需求是:创建各个学校的格式要求,批量处理论文。众所周知,不同学校的论文格式要求虽然有所不同,但模块基本上大同小异,如:封面、主标题、摘要、关键词、正文(一二三级标题和内容)、致谢和参考文献。有些论文没有致谢模块,而且位置可能在文章的开始,也可能在文章的结束,大部分情况下,参考文献也会在文章的结束。

嗨,我是大虾,一名品牌从业者,一只野生程序员。

最近接了个小单,使用PyQt为客户开发一个论文格式调整器,界面长这样:

适合小白训练的python网站(研究了一个论文的模块识别办法)(1)

格式模板创建界面

适合小白训练的python网站(研究了一个论文的模块识别办法)(2)

主界面

需求是:创建各个学校的格式要求,批量处理论文。

众所周知,不同学校的论文格式要求虽然有所不同,但模块基本上大同小异,如:封面、主标题、摘要、关键词、正文(一二三级标题和内容)、致谢和参考文献。

有些论文没有致谢模块,而且位置可能在文章的开始,也可能在文章的结束,大部分情况下,参考文献也会在文章的结束。

格式方面,可以使用win32com来调整,只需要熟悉微软的文档就可以使用了,再不济还可以参考word的宏。

整个需求中,难点其实是模块的识别,具体是,不清楚某些模块是否一定会有,各个模块的前后顺序不确定。经过几天的研究,找到了一套识别的逻辑,大大优化了模块识别的准确性。处理的逻辑如下:

1、程序获取到论文后,先识别一二三级标题所出现的段落,分别记录标题所在段落的索引,保存在列表中:

一级标题 [4 9 43 81 122] 二级标题 [10 13 19 44 46 82 89 114] 三级标题 [20 22 28 32 47 49 54] # 使用正则匹配标题,遍历每个段落,取每个段落前5-8个字符进行匹配,这样能大大提升标题识别的准确率

2、摘要、关键词、致谢及参考文献的识别

遍历每个段落,取每个段落前5-8个字符,使用正则匹配,分别记录到列表中

摘要匹配 [2] 关键词匹配 [3] 参考文献匹配 [137] 致谢匹配 []

每个段落取5-8个字符进行匹配,是符合实际情况的,比如论文的”摘要“二字一定会出现在段落的开头,出现在段落的其他位置,一定不是模块,只是普通的内容。

假如摘要匹配中,记录两个段落的索引那怎么办,如 [2 4],那就取列表的首个元素为真实的模块,其他模块一样。

3、将所有模块及对应的列表重组成字典元组列表并排序

[('thanks' []) ('sumary' [2]) ('keywords' [3]) ('title1' [4 9 43 81 122]) ('title2' [10 13 19 44 46 82 89 114]) ('title3' [20 22 28 32 47 49 54]) ('reference' [137])]

根据使用元组的最后一个元素即段落索引进行排序,按照论文的段落顺序排列,如此一来,就能确定各个模块的顺序了,此时还需要删除空列表的模块,上面的致谢模块(thanks)列表为空,意味着论文中并不存在这个模块,那可以删除了。在列表元素未知的情况下,需要使用遍历进行判断,空的就删除,不过需要注意的是,不能一边遍历一遍删除,会导致列表的索引出错,从而出现有些元素删除失败,正确的做法是,第一次遍历列表,记录空元素到A列表中,遍历A列表后再从原来的列表中删除。

# 保存空模块的索引 null_items = [] for i in new_sort: if not i[-1]: # new_sort.remove(i) 不能边遍历边删除列表 会导致索引出错 null_items.append(i) # 遍历保存下来的模块 然后从new_sort中删除 此时new_sort列表才是干净的 空模块将会从列表中删除 for item in null_items: new_sort.remove(item)

4、计算相邻模块的范围

删除了空的模块后,使用上面的列表计算模块的段落范围,除了标题外,摘要、关键词、致谢和参考文献都需要计算。

上面的示例中,删除了致谢模块后的列表应该是这样的

[('sumary' [2]) ('keywords' [3]) ('title1' [4 9 43 81 122]) ('title2' [10 13 19 44 46 82 89 114]) ('title3' [20 22 28 32 47 49 54]) ('reference' [137])]

到这里,已经很容易处理了,摘要(sumary)的段落范围为[2 3],关键词(keywords)的段落范围为[3 4],参考文献(reference)的段落范围为[137 最后一段]。

这些模块的段落索引记录好之后,就可以进行格式的调整了,可以使用Range、Paragraphs、Selection等方法进行调整了。

好了,今天的分享到此为止,我是大虾,一名品牌从业者,一只野生程序员,欢迎评论交流。

猜您喜欢: