她打开PyCharm,迅速编写脚本:
1.遍历目录:
利用`os`库扫描指定文件夹,筛选出所有Excel文件。
2.解析表格内容:使用`openpyxl`库读取每个Excel文件,
逐行提取单元格数据,以空格分隔单元格内容,以换行符区分不同行。
3.生成Word文件:调用`python-docx`库,
将整理好的文本按段落写入新的`.docx`文件,
确保数据结构清晰,便于后续分析。
```python
import os
from docx import Document
from openpyxl import load_workbook
def excel_to_word(input_dir, output_dir):
for file in os.listdir(input_dir):
if file.endswith(('.xls','.xlsx','.et')):
wb = load_workbook(os.path.join(input_dir, file))
doc = Document()
for sheet in wb.sheetnames:
ws = wb[sheet]
for row in ws.iter_rows():
row_text =''.join(str(cell.value) if cell.value else '' for cell in row)
doc.add_paragraph(row_text)
doc.save(os.path.join(output_dir, f“{os.path.splitext(file)[0]}.docx“))
```
雅晴的目标是从海量文档中提取关键信息,
找出异常高频词汇,对文本挖掘与词云分析。
如“培训费”“劳务费”“专项支出”等可能涉及问题的关键词进行数据读取与清洗。
她引入`jieba`、`re`、`wordcloud`等库,编写代码:
-使用`docx`库读取所有Word文档的段落和表格内容。
-利用正则表达式(`re.sub`)去除冗余符号(换行符、多余空格等),确保文本干净。
```python
import re
from docx import Document
def read_docx(file_path):
doc = Document(file_path)
text =[]
for para in doc.paragraphs:
cleaned = re.sub(r'\s+','', para.text.strip())
if cleaned:
text.append(cleaned)
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
cleaned = re.sub(r'\s+','', cell.text.strip())
if cleaned:
text.append(cleaned)
return ''.join(text)
```
-加载自定义词典(如“培训费”“劳务费”等审计敏感词),
优化分词准确性。
-采用**飞桨(Paddle)模式**进行精准分词,
过滤单字词,仅保留长度≥2的有效词汇。
-统计词频,按出现次数降序排列。
```python
import jieba
from collections import defaultdict
def word_freq_analysis(texts):
jieba.enable_paddle()#启用飞桨模式,提高分词精度
jieba.load_userdict(“audit_keywords.txt“)#加载审计专用词典
word_counts = defaultdict(int)
for text in texts:
words = jieba.cut(text, use_paddle=True)
for word in words:
if len(word)>= 2:#仅统计2字及以上词汇
word_counts[word]+= 1
return sorted(word_counts.items(), key=lambda x: x[1], reverse=True)
```
-设置`WordCloud`参数(最大显示词数100、自定义背景色和字体)。
-生成词云图,并通过`matplotlib`展示。
```python
from wordcloud import WordCloud
import matplotlib.pyplot as plt
def generate_word_cloud(word_freq):
wc = WordCloud(
font_path=“SimHei.ttf“,#中文字体支持
max_words=100,
background_color=“white“,
width=800,
height=600)
wc.generate_from_frequencies(dict(word_freq))
plt.imshow(wc, interpolation=“bilinear“)
plt.axis(“off“)
plt.show()
```
词云图生成后,雅晴的目光迅速锁定几个高频异常词汇:
-“培训费”出现频率极高,但账目显示部分培训未实际开展。
-“劳务费”支出频繁,但收款人信息模糊。
-“专项经费”使用分散,缺乏明细支撑。
雅晴凝视着初步生成的词云图,
敏锐地察觉到传统词频统计的局限性——高频词虽然能反映普遍现象,
但未必能精准定位异常。
为了更科学地识别关键审计风险点,
她决定引入TF-IDF(词频-逆文档频率)算法,
从海量文本中挖掘最具区分度的关键词。
TF-IDF(Term Frequency-Inverse Document Frequency)是信息检索领域的经典加权技术,其核心价值在于:
-词频(TF):衡量某个词在单份文档中的出现频率,计算公式为:
\[
ext{TF}(t, d)=\frac{ext{词} t ext{在文档} d ext{中的出现次数}}{ext{文档} d ext{的总词数}}
\]
例如,“培训费”在某一会议纪要中反复出现,
其TF值较高,可能暗示该事项的重要性。
-逆文档频率(IDF):
评估该词在整个语料库中的普遍性,计算公式为:
\[
ext{IDF}(t)=\log \left(\frac{ext{语料库中文档总数}}{ext{包含词} t ext{的文档数量}+ 1}\right)
\]
若“培训费”出现在少数文档中(如仅继续教育学院的会议记录),
其IDF值较高,表明该词具有领域特异性,需重点关注;
反之,若“会议”“学习”等通用词遍布所有文档,则IDF值较低,可适当忽略。
- TF-IDF综合权重:
\[
ext{TF-IDF}(t, d)=ext{TF}(t, d)imes ext{IDF}(t)
\]
该值越高,说明词语**在局部高频且全局稀有**,极可能是审计关键线索。
雅晴快速编写代码,利用`scikit-learn`库实现TF-IDF计算:
文本向量化
```python
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
#加载所有文档内容到列表corpus
corpus =[read_docx(file) for file in docx_files]
#词袋模型向量化
vectorizer = CountVectorizer(tokenizer=lambda x: jieba.cut(x, use_paddle=True))
X_counts = vectorizer.fit_transform(corpus)
```
-`CountVectorizer`将文本转换为词频矩阵,自动过滤单字词。
TF-IDF权重计算:
```python
transformer = TfidfTransformer()
X_tfidf = transformer.fit_transform(X_counts)
```
-输出结果为稀疏矩阵,每行代表一个文档,
每列对应一个词的TF-IDF值。
构建审计关键词字典:
```python
import numpy as np
#获取所有词语
words = vectorizer.get_feature_names_out()
#计算全局TF-IDF总和(按词聚合)
tfidf_sum = np.array(X_tfidf.sum(axis=0)).flatten()
word_tfidf_dict = dict(zip(words, tfidf_sum))
#过滤低权重词(如TF-IDF总和<0.1)
audit_keywords ={k: v for k, v in word_tfidf_dict.items() if v >= 0.1}
```
3.关键审计发现与风险定位
基于TF-IDF优化的词云图(下图)清晰凸显出继续教育学院的异常高频专项词汇:
-“学费”(TF-IDF=4.32):
与成人教育收入相关,需核对缴费名单与银行流水是否一致。
-“培训费”(TF-IDF=3.89):
多份纪要提及“合作机构分成”,但凭证缺失具体协议。
-“场地使用费”(TF-IDF=2.76):
同一场地在不同月份报价差异达300%,疑虚增成本。
雅晴在审计底稿中标注:
“上述事项涉及大额资金流动,但支撑材料不完整,
需重点核查原始合同、银行回单及验收记录。”
审计程序深化
针对TF-IDF筛选出的关键词,她制定下一步计划:
1.凭证追溯:对“培训费”“评估费”等高频支出,逐笔检查发票真伪与付款对象资质。
2.交叉比对:将会议纪要中的“合作机构”名称与财务系统的收款方匹配,排查虚构交易。
3.趋势分析:对比历年“场地使用费”支出,验证波动合理性。
雅晴的审计方法体现了智能审计(AI Auditing)的前沿实践:
-算法赋能:TF-IDF替代人工经验判断,科学量化文本风险。
-精准定位:剔除通用词汇干扰,直指异常高频专项词。
-业财融合:将文本线索与财务凭证交叉验证,提升审计证据链完整性。
“传统审计看账,现代审计读数据。”
她合上笔记本,目光锐利地望向那堆凭证——在算法的指引下,真相已呼之欲出。
马处抬手看了看腕表,时针已经指向了八点。
窗外的天色完全暗了下来,只剩下办公楼里的零星灯光。
他环顾四周,发现审计组的同事们虽然还在埋头工作,
但明显已经疲惫不堪——老张时不时揉着发酸的后颈,
小赵的肚子已经咕咕叫了好几声,
雅晴虽然还在专注地盯着电脑屏幕,但眼睛里已经布满了红血丝。
“同志们,”马处清了清嗓子,声音在安静的会议室里显得格外洪亮,
“今天天不早了,已经快八点了。”
他故意停顿了一下,等大家都抬起头来,
“中午大家只吃了一顿肯德基外卖,肚子都咕咕叫了吧?”