大数据技术在会计与财务中的应用 课件 第4章 文本分析技术_第1页
大数据技术在会计与财务中的应用 课件 第4章 文本分析技术_第2页
大数据技术在会计与财务中的应用 课件 第4章 文本分析技术_第3页
大数据技术在会计与财务中的应用 课件 第4章 文本分析技术_第4页
大数据技术在会计与财务中的应用 课件 第4章 文本分析技术_第5页
已阅读5页,还剩142页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大数据技术在会计与财务中的应用2026/9/7《大数据技术在会计与财务中的应用》配套课件第4章·4.1文本分析概述目录4.1.1文本分析的技术简述4.1.2文本分析的任务简述4.1

文本分析4.1文本分析概述|02/104.1.1文本分析的技术简述总的来说,文本分析技术可以分为以下几类:1-词典法通常的步骤如下:(1)人工确定一个词典,词典中的词汇可以是单个词,也可以是短语,甚至可以是句子。词典的主题要和研究者的研究主题相关。(2)将词典中的词汇和文本进行匹配,匹配的方法有很多种,比如精确匹配,模糊匹配,正则匹配等等。(3)利用匹配结果,分析计算一段文本的特征,比如语气、情感和可读性等。例如,一段文本的正负向情感可以通过文本中的正向词汇和负向词汇数量的差值来衡量。4.1文本分析概述|03/104.1.1文本分析的技术简述2.传统机器学习法传统机器学习法通常包括使用朴素贝叶斯(NaiveBayes)、支持向量机(SupportVectorMachines)、随机森林(RandomForests)、主题模型(TopicModeling)等方法进行文本的分类、聚类以及主题抽取等。3.深度学习法深度学习法通常包括使用词嵌入(WordEmbeddings)、循环神经网络(RecurrentNeuralNetworks,RNN),卷积神经网络(ConvolutionalNeuralNetworks,CNN)等方法进行文本的分类、聚类、主题抽取等。近年来又出现了以Transformer为代表的新一代深度学习模型,相对于传统的深度学习模型,Transformer模型在处理序列数据时,能够考虑到词与词之间的长期依赖关系,因此在处理自然语言时表现更加优异。目前自然语言处理领域最为流行BERT,GPT,还有DeepSeek模型正是基于Transformer构建的。4.1文本分析概述|04/104.1.1文本分析的任务简述1.情感分类情感分类(SentimentAnalysis)任务旨在分析文本中所包含的情感色彩,例如对文本的正面、负面或中性情感的分类。在会计研究中,情感分类可以应用于:(1)财务报告情感分析:了解公司管理层对财务业绩、未来计划等方面的情感色彩。(2)投资者关系活动情感分析:分析公司在电话会议、分析师报告等投资者关系活动中表达的情感,以识别市场反应。(3)社会责任报告情感分析:评估公司在社会责任和可持续发展报告中的情感,从而了解公司的社会责任态度。4.1文本分析概述|05/104.1.1文本分析的任务简述2.主题抽取主题抽取(TopicExtraction)任务旨在从文本中识别并提取出隐含的主题或话题。在会计研究中,主题抽取可应用于:(1)财务报告主题抽取:识别财务报告中涉及的主要财务指标、战略方向、风险因素等主题。(2)管理层讨论与分析(MD&A)主题抽取:从MD&A部分抽取出涉及公司经营状况、未来计划等的主题。(3)社会责任报告主题抽取:了解社会责任报告中关于环境、社会、治理等方面的主题。4.1文本分析概述|06/104.1.1文本分析的任务简述3.会计舞弊检测虽然会计舞弊检测(FraudDetection)不是典型的文本分析任务,但通常涉及对财务报告、公司声明等文本的分析,以识别潜在的舞弊迹象。文本分析可用于:(1)舞弊报告的文本分析:分析公司内部和外部的舞弊报告、调查报告,以了解可能存在的舞弊行为。(2)财务报告文本的异常分析:寻找在财务报告中可能表明舞弊的异常用词、语法结构等。4.1文本分析概述|07/104.1.1文本分析的任务简述4.文本复杂度/可读性分析文本复杂度分析(TextComplexityAnalysis)旨在考察文本的复杂程度,通常涉及到对文本的可理解性或可读性等方面的分析。文本复杂度受多方面的影响,比如词汇的复杂程度、句子的复杂程度、句子的长度、句子的结构等。研究者通常关注文本的词汇和句法信息。例如文中包含的长词汇、生僻词汇、专业词汇等,以及文中包含的长句子、复杂句子、被动句子等。4.1文本分析概述|08/104.1.1文本分析的任务简述5.文本相似度分析文本相似度分析(TextSimilarityAnalysis)是一种用于确定两段文本在意义或结构上的相似程度的技术。这种分析常用于多种场景,包括搜索引擎优化、抄袭检测、语言翻译和自然语言处理。文本相似度可以通过多种方法来测量,包括:余弦相似度,其通过计算两个文本向量之间的余弦值来计算相似度;Jaccard相似性,其通过计算两个词汇集合的交集和并集的比例来测量相似度;编辑距离(Levenshtein距离),其计算将一个字符串转换为另一个字符串所需的最小编辑操作(插入、删除、替换)次数。4.1文本分析概述|09/102026/9/7《大数据技术在会计与财务中的应用》配套课件谢谢观赏!4.1文本分析概述|10/10大数据技术在会计与财务中的应用作者:张敏等2026/9/7《大数据技术在会计与财务中的应用》配套课件第4章·4.2文本预处理目录4.2.1英文文本预处理4.2.2中文文本的预处理4.2

文本预处理4.2文本预处理|02/14在进行自然语言处理(NLP)任务时,文本预处理是一个关键步骤,它有助于将原始文本数据转换为适合机器学习模型的格式。原始的文本信息中通常存在着大量的“噪声”。例如,在英文文本中,不同的词可能只是时态不同,但其基本内涵是一致的。如果不对原始文本进行预处理,还原词汇本来的含义,可能就会导致计算机误判词和词之间的关系,或者浪费计算机资源。因此,在对文本进行进一步的处理之前,预处理是必要的。4.2

文本预处理4.2文本预处理|03/144.2.1英文文本预处理英文文本预处理的步骤通常包括以下内容:标记(Tokenization)、去除停用词(StopwordRemoval)、词干提取(Stemming)、词形还原(Lemmatization)、移除特殊字符和标点符号、转换为小写等。下面是一个简单的文本预处理代码示例,用以演示文本预处理的常见步骤,我们使用Python和NLTK(NaturalLanguageToolkit)库代码见下页4.2文本预处理|04/144.2.1英文文本预处理importnltk##导入用到的库

fromnltk.corpusimportstopwords

fromnltk.tokenizeimportword_tokenizefromnltk.stemimportPorterStemmer,WordNetLemmatizer

importstring#下载分词器,停用词,和词形还原器需要的数据包nltk.download('punkt')

nltk.download('stopwords')

nltk.download('wordnet')

4.2文本预处理|05/144.2.1英文文本预处理deftext_preprocessing(text):

#1.将文本转换为小写

text=text.lower()

#2.去除特殊字符和标点符号

text=''.join([charforcharintextifcharnotinstring.punctuation])

#这里的string.punctuation就是标点符号集合,它是Python内置的字符串

#3.标记化(Tokenization)

tokens=word_tokenize(text)#标记化指分词---即我们把句子分成一个一个的单词

#经过这一步处理后,tokens就是一个列表,其中的每个元素就是一个个单词

#可以用以下这条命令打印出来看看

print(tokens)4.2文本预处理|06/144.2.1英文文本预处理文本中通常会包含一些冗余词汇(停用词),比如“is”,“and”,“the”,“at”等等,我们需要把这类词汇去掉,然后再进行文本分析,以防此类无实际意义的词汇影响文本分析的准确度。词干提取是在单个词的基础上执行的,而不考虑单词的上下文,而词形还原还需要了解上下文的信息。4.2文本预处理|07/144.2.1英文文本预处理#4.去除停用词(StopwordRemoval)

stop_words=set(stopwords.words('english'))

tokens=[wordforwordintokensifwordnotinstop_words]

#5.词干提取(Stemming)

porter=PorterStemmer()

tokens=[porter.stem(word)forwordintokens]

#6.词形还原(Lemmatization)

lemmatizer=WordNetLemmatizer()

tokens=[lemmatizer.lemmatize(word)forwordintokens]4.2文本预处理|08/144.2.1英文文本预处理#7.合并处理后的文本

preprocessed_text=''.join(tokens)

returnpreprocessed_text

#示例文本

sample_text="Textpreprocessingisanessentialstepinnaturallanguageprocessing.“#进行文本预处理

processed_text=text_preprocessing(sample_text)

print("原始文本:",sample_text)

print("处理后的文本:",processed_text)运行后,输出的结果为:原始文本:Textpreprocessingisanessentialstepinnaturallanguageprocessing.

处理后的文本:textpreprocessessentistepnaturlanguagprocess

4.2文本预处理|09/144.2.2中文文本预处理当我们要处理的文本是中文时,情况会稍有不同,因为中文没有空格来分隔单词。因此,我们需要使用中文分词工具来将中文文本分割为单词。下面是一个简单的中文文本预处理代码示例,使用Python和jieba库:4.2文本预处理|10/144.2.2中文文本预处理importjieba

importstring

fromjiebaimportposseg

defchinese_text_preprocessing(text):

#1.去除特殊字符和标点符号

text=''.join([charforcharintextifcharnotinstring.punctuation])

#如果有需要,可以添加自定义词典

dic=["中文文本","预处理"]

forwordindic:

jieba.add_word(word)

#2.分词

seg_list=jieba.cut(text)

#如果想要进行词性标注,可以使用jieba.posseg.cut()方法,它会返回一个由词和词性组成的元组

#seg_list=posseg.cut(text)

#3.去除停用词(可以根据实际情况自定义停用词表,或者从文件中读取)

stop_words=set(["的","了","是","我","你","他","她"])

seg_list=[wordforwordinseg_listifwordnotinstop_words]

#4.合并处理后的文本

preprocessed_text=''.join(seg_list)

returnpreprocessed_text

4.2文本预处理|11/144.2.2中文文本预处理#示例文本

sample_text="中文文本预处理是自然语言处理中的重要步骤。"

#进行中文文本预处理

processed_text=chinese_text_preprocessing(sample_text)

print("原始文本:",sample_text)

print("处理后的文本:",processed_text)代码输出结果如下:原始文本:中文文本预处理是自然语言处理中的重要步骤。

处理后的文本:中文文本预处理自然语言处理中重要步骤。4.2文本预处理|12/144.2.2中文文本预处理在这个示例中,chinese_text_preprocessing函数接受中文原始文本并返回经过处理的文本。具体的步骤包括去除特殊字符和标点符号、中文分词、去除停用词等。我们可以根据实际需求对代码进行调整,甚至可以加入自定义的词典,以便更好地处理特定的文本数据。请注意,中文分词是中文文本预处理中的一个关键步骤,而jieba是一个常用的中文分词库。我们可以根据实际情况选择其他分词工具或库。另外,停用词表也可以根据具体任务和语料库的特点进行自定义。本书以英文语料为主要研究对象,本章剩余内容主要以英文语料的处理展开,除了文本清洗外,中英文文本分析的步骤与方法基本一致。4.2文本预处理|13/142026/9/7《大数据技术在会计与财务中的应用》配套课件谢谢观赏!4.2文本预处理|14/14大数据技术在会计与财务中的应用作者:张敏等2026/9/7《大数据技术在会计与财务中的应用》配套课件第4章·4.3文本的特征提取目录4.3.1正则表达式4.3.2文本常见指标的计算4.3文本的特征提取4.3文本的特征提取|02/30想要了解一段文本的具体含义,必须首先读懂一段文本。然而,计算机是无法直接理解人类语言的——计算机只能识别“0”和“1”的区别。因此,我们需要将文本的特征抽象为数学表达,然后将这些数学表达输入到模型中供计算机处理。作为商科学生,我们不需要掌握这些计算机底层知识,本节主要介绍如何使用词典法计算一段文本的词和句子的数量,判断文本的情感和语气,以及分析一段文本的复杂度。这些基础性的工作虽然简单直接,但也是将非结构化文本数据转换为数值化特征的过程,是构建复杂的文本分析变量的基础。4.3文本的特征提取4.3文本的特征提取|03/304.3.1正则表达式正则表达式(RegularExpression或Regex)是一系列定义文本搜索模式的字符序列。正则表达式在各种文本处理任务中非常有用,包括识别特定的单词、短语、实体名称、数字、文本中的URL链接,将文本分割成句子,将句子进行分类等等。具体到学术研究领域,我们可以使用正则表达式在文档中识别正面和负面的词汇,然后计算其语调;将文档中的句子分类为前瞻性或与风险相关的句子;或者根据某些条件将文档区分为不同的类别。4.3文本的特征提取|04/304.3.1正则表达式正则表达式的发明者是斯蒂芬·科尔·克莱尼,他是是一名美国数学家、逻辑学家,主要从事对可计算函数的研究,而他的递归理论研究有助于奠定理论计算机科学的基础而真正将正则表达式引入编辑器和编程领域的是肯·汤普逊。在贝尔实验室工作期间,汤普逊设计和实现了Unix操作系统。他创造了B语言——C语言的前身,而且他是Plan9操作系统的创造者和开发者之一。2006年,汤普逊进入Google公司工作,与他人共同设计了Go语言。他与丹尼斯·里奇同为1983年图灵奖得主。4.3文本的特征提取|05/304.3.1正则表达式正则表达式中有一些特殊字符,它们具有特殊的含义,用于表示一些模式或操作。以下代码是的较为常见的正则表达式字符,读者可以直接查阅:.(点号):匹配除换行符\n外的任何字符。*(星号):匹配前面的元素零次或多次。+(加号):匹配前面的元素一次或多次。?(问号):匹配前面的元素零次或一次。[](字符集):匹配其中任意一个字符,例如[aeiou]匹配任何一个元音字母。|(管道符):表示或,匹配两个模式中的一个。()(括号):用于创建捕获组,也可以用于指定子表达式的范围。\(反斜杠):用于转义特殊字符,使其失去特殊含义,或者表示一些预定义的字符集,如\d表示数字。{}(花括号):用于指定前面元素的重复次数,例如{3}表示重复3次,{1,3}表示重复1到3次。4.3文本的特征提取|06/304.3.1正则表达式上述字符集用于匹配一个字符的集合。如果需要匹配一组字符,则需使用字符集。字符集使用方括号[]表示,可以包含一系列字符,其中任何一个字符都可以参与匹配。需要注意的是,匹配完成后,正则匹配光标就跳转到之后的文本了。例如,表达式[123]在匹配到数字1后,即停止寻找2和3,进入之后的匹配。以下是一些字符集的示例:单个字符集:[aeiou]:匹配任何一个元音字母。[123]:匹配数字1、2或3。

字符范围:[a-z]:匹配任何小写字母。[A-Z]:匹配任何大写字母。[0-9]:匹配任何数字。[a-zA-Z]:匹配任何字母。

字符集取反:[^aeiou]:匹配任何非元音字母。[^0-9]:匹配任何非数字字符。

预定义字符集:\d:匹配任何数字,相当于[0-9]。\D:匹配任何非数字字符,相当于[^0-9]。\w:匹配任何字母数字字符,相当于[a-zA-Z0-9_]。\W:匹配任何非字母数字字符,相当于[^a-zA-Z0-9_]。\s:匹配任何空白字符,包括空格、制表符、换行符等。\S:匹配任何非空白字符。4.3文本的特征提取|07/304.3.1正则表达式

4.3文本的特征提取|08/304.3.1正则表达式正则表达式相关函数在Python中,内置的re模块提供了正则表达式的常用函数,具体如下:pile(pattern):将正则表达式模式编译为一个正则表达式对象,可以用于匹配字符串的其他操作;

re.match(pattern,string):从字符串的起始位置匹配正则表达式模式,如果匹配成功,则返回一个Match对象,否则返回None(注意:即使字符串的起始位置不匹配,re.match()也会返回一个Match对象,但是它只会在字符串的起始位置匹配成功);

re.search(pattern,string):扫描字符串,在正则表达式模式首次匹配的位置停止;如果匹配成功,则输出一个Match对象,否则返回None;

re.findall(pattern,string):查找字符串中所有与正则表达式模式匹配的子字符串,并将它们作为列表返回;

re.finditer(pattern,string):查找字符串中所有与正则表达式模式匹配的子字符串,并将它们作为迭代器返回;

re.split(pattern,string):在正则表达式模式的每个匹配处拆分字符串,并返回一个字符串列表。例如,可以通过在空格处拆分句子来获取句子中的单词;

re.sub(pattern,repl,string):查找字符串中所有匹配正则表达式模式的部分,并用repl进行替换。正则表达式模式可以用单引号''或双引号""指定。4.3文本的特征提取|09/304.3.1正则表达式正则表达式模式可以使用单引号和双引号进行指定,分别是''和""。在Python的re操作中,向正则表达式模式添加字母“r”是一个常见的习惯(例如,re.search(r'pattern',string))。在模式前加上“r”表示反斜杠应该被视为字面字符,而不是在Python中作为转义字符处理。换句话说,前缀“r”表示该字符串是一个“原始字符串”(rawstring)。当反斜杠用于转义字符时,会被python和正则表达式引擎两次处理,因此在正则表达中表示两个“\”时,需要写成“\\\\”。而在带“r”的原始字符串中,只需要写成“\\”即可。4.3文本的特征提取|10/304.3.1正则表达式以下是正则表达式相关函数的简单代码示例:importre

pattern=pile(r'\b\w+\b')#pile(pattern,flags=0):用于编译正则表达式模式,返回一个正则表达式对象。这样可以提高匹配效率,特别是在需要多次匹配时。

4.3文本的特征提取|11/304.3.1正则表达式result1=re.match(r'\b\w+\b','HelloWorld')#re.match(pattern,string,flags=0):尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

result2=re.search(r'\b\w+\b','HelloWorld')#re.search(pattern,string,flags=0):扫描整个字符串并返回第一个成功的匹配,如果匹配失败,则返回none。

result3=re.findall(r'\b\w+\b','HelloWorld')#re.findall(pattern,string,flags=0):在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

result4=re.finditer(r'\b\w+\b','HelloWorld')#re.finditer(pattern,string,flags=0):和findall()函数相似,但返回的不是列表,而是一个迭代器,只能用于for循环中。

result5=re.split(r'\s+','HelloWorld')#re.split(pattern,string,maxsplit=0,flags=0):将一个字符串按照正则表达式匹配结果进行分割,返回列表类型。

result6=re.sub(r'\s+','-','HelloWorld')#re.sub(pattern,repl,string,count=0,flags=0):在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串。

print(result1)

print(result2)

print(result3)

print(result4)

print(result5)

print(result6)4.3文本的特征提取|12/304.3.1正则表达式输出结果如下:<re.Matchobject;span=(0,5),match='Hello'>

<re.Matchobject;span=(0,5),match='Hello'>

['Hello','World']

<callable_iteratorobjectat0x0000029B9A49B340>

['Hello','World']

Hello-World4.3文本的特征提取|13/304.3.1正则表达式在正则表达式中,使用分组可以将多个模式组合在一起,并对其进行操作。可以使用圆括号()来定义分组,其中包含的模式将作为一个整体进行匹配。分组提供了以下几个主要的功能:(1)限定范围:分组允许将模式组织在一起,并应用限定符(如*、+、?、{})来指定匹配次数。(2)捕获:可以使用分组将匹配的部分捕获到一个单独的组中,以后可以通过引用组来获取匹配的内容。(3)非捕获分组:在分组中添加?:可以创建非捕获分组,即匹配但不捕获结果。下面来看几个简单的例子:正则表达式r"TotalAssets=($[\d,.]+)\b"应用于字符串“TotalAssets=$10,000,000”将产生两个匹配:(1)完全匹配:‘TotalAssets=$10,000,000’(2)组匹配:‘$10,000,000’正则表达式r"Email:([\w.-]+@[\w.-]+.edu)"应用于字符串“Email:abc@ABC.edu”将产生两个匹配:(1)完全匹配:‘Email:abc@ABC.edu’(2)组匹配:‘abc@ABC.edu’我们还可以在同一正则表达式中引用先前的组匹配,这被称为反向引用(backreferencing)。我们需要在正则表达式中使用\n以引用第n组匹配的文本。例如,正则表达式r"\b(\w+)\s\1\b"将捕获文本中重复的单词(例如,“wewe”,“inin”,“aboveabove”等);这其中,\b(\w+)\s捕获一个单词后跟一个空格\s。\1后跟边界\b捕获第一个(且唯一的)组的结果。为方便寻找匹配到的组及提高可读性,我们可以使用语法(?P<name>pattern)给正则表达式组命名。4.3文本的特征提取|14/304.3.1正则表达式正则表达式的综合应用importre

#下述代码匹配一个数字后面跟着两个字母

pattern1=pile(r'\d{1,3}([a-zA-Z]{2})')

result1=pattern1.match('123ab')#调用match方法进行匹配

print(result1.group(1))#输出:ab

#在上述的例子中,元素\d{1,3}匹配一个包含1到3个数字的序列,元素([a-zA-Z]{2})匹配两个字母的序列,并使用括号将其分组,以便可以通过group(1)获取匹配的内容。

4.3文本的特征提取|15/304.3.1正则表达式

#下述代码匹配日期格式,捕获年、月、日

pattern2=pile(r'(\d{4})-(\d{2})-(\d{2})')

result2=pattern2.match('2026/9/7')#调用match方法进行匹配

print(result2.group(1))#输出:2023

print(result2.group(2))#输出:12

print(result2.group(3))#输出:10

#在上述的例子中,使用了三个分组,每个分组用于匹配年、月、日,并可以通过相应的group方法获取捕获的内容。

#下述代码匹配一个以"Mr."或"Ms."开头的名字

pattern3=pile(r'(?:Mr\.|Ms\.)(\w+)')

result3=pattern3.match('Mr.Smith')#调用match方法进行匹配

print(result3.group(1))#输出:Smith

#在上述的例子中,使用了非捕获分组(?:...)来匹配以"Mr."或"Ms."开头的名字,但只捕获名字部分,不捕获"Mr."或"Ms."。

#将小组命名为group1和group2,并取出group2

regex=r"\b(?P<word1>\w+)\s(?P<word2>to)\b"

#这是我们的测试文本

text="weweexpectthisthistrendtocontinue"

#调取group2,即tore.search(regex,text).group('word2')4.3文本的特征提取|16/304.3.1正则表达式零宽断言用于在匹配字符串的过程中,对字符串进行一些限定,例如规定匹配的字符串后面需要跟什么特定字符,以及匹配的字符串前面需要出现什么特定字符,但是不会将这些限定的字符串作为匹配结果的一部分。(1)(?=pattern)零宽正向先行断言(zero-widthpositivelookaheadassertion)(2)(?!pattern)零宽负向先行断言(zero-widthnegativelookaheadassertion)(3)(?<=pattern)零宽正向后行断言(zero-widthpositivelookbehindassertion)(4)(?<!pattern)零宽负向后行断言(zero-widthnegativelookbehindassertion)4.3文本的特征提取|17/304.3.1正则表达式下面我们用几个具体的例子来说明其用法,请参阅代码和注释:importre

str1="microsoft'searningsthisyearis12.4billion,upmorethaneightpercentfromlastyear'searningsof11.4billion."

#这里的?=是正向肯定预查,即ea后面跟着rning

regex=r"ea(?=rning)"

#这里的?!是正向否定预查,即ea后面不跟着rningregex2=r"ea(?!rning)"

#这里的?<=是反向肯定预查,即ea前面跟着\w

regex3=r"(?<=\w)ea"4.3文本的特征提取|18/304.3.1正则表达式

#这里的?<!是反向否定预查,即ea前面不跟着\w

regex4=r"(?<!\w)ea"

#我们使用了start()方法,返回匹配开始的位置索引,这里是第一个ea的位置

print(re.search(regex,str1).start())

#这是第二个ea的位置print(re.search(regex2,str1).start())

#这是第三个ea的位置

print(re.search(regex3,str1).start())

#这是第四个ea的位置

print(re.search(regex4,str1).start())4.3文本的特征提取|19/304.3.2文本中常见指标的计算1.计算句子和单词的数量单词和句子数量的计算是文本分析中最简单的任务之一。这是计算文本其他指标的基础。诸多文本分析方法都需要计算文本句子或者单词的数量。例如,在判断一段文字的正负面情绪时,需要对正负向词汇进行计数,有时我们还会利用文本中的单词和句子数量进行比例化,以计算正负语义的单词所占的比例。4.3文本的特征提取|20/304.3.2文本中常见指标的计算(1)计算单词数量。定义并调用相关函数以计算单词数量。#采用nltk的word_tokenize函数,可以将文本分割成单词,然后再统计单词的个数

importnltk

fromnltk.tokenizeimportword_tokenize

defcount_words_nltk(input_text:str):#把长文本分割成单词

words=word_tokenize(input_text)#这里是为了去掉标点符号

words=[wordforwordinwordsifword.isalpha()]#统计单词个数

word_count=len(words)

returnword_count

text="""Weacquireothercompaniesandintangibleassetsandmaynotrealizealltheeconomicbenefitfromthoseacquisitions,whichcouldcauseanimpairmentofgoodwillorintangibles.Wereviewouramortizableintangibleassetsforimpairmentwheneventsorchangesincircumstancesindicatethecarryingvaluemaynotberecoverable.Wetestgoodwillforimpairmentatleastannually.Factorsthatmaybeachangeincircumstances,indicatingthatthecarryingvalueofourgoodwilloramortizableintangibleassetsmaynotberecoverable,includeadeclineinourstockpriceandmarketcapitalization,reducedfuturecashflowestimates,andslowergrowthratesinindustrysegmentsinwhichweparticipate.Wemayberequiredtorecordasignificantchargeonourconsolidatedfinancialstatementsduringtheperiodinwhichanyimpairmentofourgoodwilloramortizableintangibleassetsisdetermined,negativelyaffectingourresultsofoperations."""

#调用我们自定义的函数

text_length=count_words_nltk(text)

#输出结果print(f"Numberofwordsintext:{text_length}")print(word_tokenize(text))4.3文本的特征提取|21/304.3.2文本中常见指标的计算(2)计算句子数量。我们可以调用自定义函数并计算该段文本的句子数量#直接调用nltk的sent_tokenize函数,则可以将文本分割成句子,然后再统计句子的个数

importnltk

fromnltk.tokenizeimportsent_tokenize

defcount_sentences_nltk(input_text:str):#把长文本分割成句子

sentences=sent_tokenize(input_text)#统计句子个数

sentence_count=len(sentences)#返回结果

returnsentence_count

#调用刚才自定义的函数

num_sentences=count_sentences_nltk(text)print(f"Numberofsentencesintext:{num_sentences}")4.3文本的特征提取|22/304.3.2文本中常见指标的计算2.情感分析文本的情感分析通常是指对文本的情感极性进行分析,即判断文本是正向情感还是负向情感。情感分析在商业领域有着广泛的应用,比如对用户评论的情感进行分析等。例如,Campbell和Shang(2022)通过基于词典法的模型,分析公司员工在Glassdoor上对雇主的评论的语气特征,来度量公司的违规风险。Jiang等(2019)构建了一个基于词典法的模型,利用10-K、10-Q以及电话会议的语料,度量公司管理层的情感基调,进而预测股票收益。4.3文本的特征提取|23/304.3.2文本中常见指标的计算让我们来看一个简单的例子:判断一段话是正向情感(positive)还是负向情感(negative)。(1)准备正则表达式。定义正则表达式便于后面的分析,这是此类分析的基础。importre

#这是一个txt文件,里面是积极的词语

positive_words_dict=r".\positive.txt"#这是一个txt文件,里面是消极的词语negative_words_dict=r".\negative.txt"

defcreate_dict_regex_list(dict_file:str):

withopen(dict_file,'r')asf:#每一个文件中的词语都是以换行符分隔的(打开演示),所以我们用splitlines()来把每一行分开

dict_terms=f.read().splitlines()

#为每个词语加上\b,然后用列表推导式生成一个正则表达式列表

dict_terms_regex=[pile(r'\b'+term+r'\b')fortermindict_terms]

#返回的是一个列表,列表中的每一个元素都是一个正则表达式s

returndict_terms_regex

4.3文本的特征提取|24/304.3.2文本中常见指标的计算#调用函数,得到正向词语的正则表达式列表

positive_words_regex=create_dict_regex_list(positive_words_dict)

#调用函数,得到负向词语的正则表达式列表

negative_words_regex=create_dict_regex_list(negative_words_dict)

#把这些正则表达式打印出来检查一下

print(positive_words_regex[0:5])print(negative_words_regex[0:5])4.3文本的特征提取|25/304.3.2文本中常见指标的计算(2)定义并调用函数。我们要定义一个情感分析函数,并用这个函数计算一段特定文本的正负向情感词汇的数量。defget_tone(str):

#以下代码用来找到str中的正向词语和负向词语,然后计算正向词语和负向词语的数量,最后计算tone

#找到str中所有正向词语的列表

positive_match=[re.findall(regex,str)forregexinpositive_words_regex]

#计算正向词语的数量

positive_match_count=sum([len(match)formatchinpositive_match])

#找到str中所有负向词语的列表

negative_match=[re.findall(regex,str)forregexinnegative_words_regex]

#计算负向词语的数量

negative_match_count=sum([len(match)formatchinnegative_match])

#计算str中所有单词的数量

total_words=len(re.findall(r'\b[a-zA-Z\'\-]+\b',str))

#计算tone

tone=100*(positive_match_count-negative_match_count)/total_words

#返回结果

return(total_words,positive_match_count,negative_match_count,tone)

4.3文本的特征提取|26/304.3.2文本中常见指标的计算

text='''AtFedExGround,wehavethemarketleadinge-commerceportfolio.Wecontinuetoseestrongdemandacrossallcustomersegmentswithournewseven-dayservice.WewillincreaseourspeedadvantageduringtheNewYear.OurSundayroll-outwillspeedupsomelanesbyoneandtwofulltransitdays.Thiswillincreaseouradvantagesignificantly.Andasyouknow,wearealreadyfasterbyatleastonedaywhencomparedtoUPS'sgroundservicein25%oflanes.Itisalsoreallyimportanttonoteourspeedadvantageandseven-dayserviceisalsoveryvaluableforthepremiumB2Bsectors,includinghealthcareandperishablesshippers.Now,turningtoQ2,I'mnotpleasedwithourfinancialresults.'''

#调用函数,得到tone

counts=get_tone(text)

print(counts)通过上述代码,可以获得正负向情感词数和情感值。(114,14,3,9.649122807017545)4.3文本的特征提取|27/304.3.2文本中常见指标的计算2.量化文本的复杂度文本复杂性指的是阅读、理解文本的相对难度。复杂的披露使阅读和理解变得困难,因此增加了使用此类披露的处理成本。基于此,企业披露信息的复杂性受到财会学者的广泛关注。研究者们探讨了多种因素,以解释为何某些企业的文本披露相较于其他企业更为复杂。在语言学中,FogIndex是用于评估英语写作可读性的经典指标。该指数反映了首次阅读特定文本时需要的正式教育年限。例如,迷雾指数为12的文本对应着美国高中高年级学生(大约18岁)的阅读能力。4.3文本的特征提取|28/304.3.2文本中常见指标的计算我们可以使用Python中现成的包(readability包)来计算FogIndex。fromreadabilityimportReadability

defcalculate_readability(text:str):

#利用gunning_fog方法计算文本的可读性

results=Readability(text).gunning_fog()

#返回值是results的score属性,也就是文本的可读性分数

returnresults.score

#我们利用了readability包中的gunning_fog方法来计算文本的可读性,这里的结果是一个分数,分数越高,说明文本越难读

print(f"Gunningfogscorefortext:{calculate_readability(text)}")4.3文本的特征提取|29/302026/9/7《大数据技术在会计与财务中的应用》配套课件谢谢观赏!4.3文本的特征提取|30/30大数据技术在会计与财务中的应用作者:张敏等2026/9/7《大数据技术在会计与财务中的应用》配套课件第4章·4.4词袋模型与词向量目录4.4.1Bagofwords词袋模型4.4.2词频-逆文档频率(TF-IDF)4.4.3Word2vec算法4.4.4基于机器学习算法的一个完整的文本分类任务4.4词袋模型与词向量4.4词袋模型与词向量|02/26计算机是无法直接处理文本数据的,因此,我们需要将文本转换为可以计算的形式。在这里,我们引入词袋模型BOW(bagofwords)来表示文本。BOW模型有着广泛的应用,例如,Brown等(2018)利用BOW构建余弦相似度,研究了SEC对公司的风险披露进行调查的溢出效应。Purda和Skillicorn(2014)利用BOW构建文本分析工具,用来预测公司的财报舞弊行为。4.4.1Bagofwords词袋模型4.4词袋模型与词向量|03/26在词袋模型中,文本被表示为一个向量,其中每个元素代表一个单词及其计数。在这种方法下,每段文本都被表示为一个向量,代表文本中的每个单词及其计数。例如,短语“cashflowsfromoperations”和“cashflowsfrominvesting”可以分别表示为向量u和v,如下表所示:4.4.1Bagofwords词袋模型句向量/单词cashflowsfrominvestingoperationsu11101v111104.4词袋模型与词向量|04/26

4.4.1Bagofwords词袋模型4.4词袋模型与词向量|05/26将文本转化成数字表达,涉及两个步骤:第一,从文本中提取单词;第二,将单词计数表示为数值向量。我们使用NLTK库从文本中提取单词,并使用Scikit-learn库将单词列表转换为向量。4.4.1Bagofwords词袋模型4.4词袋模型与词向量|06/26(1)准备库和函数。准备好相关的库和函数,以便调用。importnltk

#导入标点符号

fromstringimportpunctuation

#这里我们把标点符号和一些特殊符号都加进去punctuation_added=punctuation+"’"+"‘"+"—"

print(punctuation_added)

fromnltkimportword_tokenize

fromnltk.corpusimportstopwords

fromnltk.stemimportPorterStemmer

#导入英文的停用词

set_stopwords=set(stopwords.words('english'))

#导入英文的词干提取器stemmer=PorterStemmer()

4.4.1Bagofwords词袋模型4.4词袋模型与词向量|07/26#下面函数的作用是:把文本分割成单词,然后去掉标点符号,去掉停用词,然后提取词干

defcustom_tokenizer(text):

#把文本分割成单词,然后把单词都变成小写

words=word_tokenize(text.lower())

#去掉标点符号words=[word.lower()forwordinwordsifwordnotinpunctuation_added]

#去掉停用词words=[wordforwordinwordsifwordnotinset_stopwords]

#提取词干words=[stemmer.stem(word)forwordinwords]

#返回结果

returnwords4.4.1Bagofwords词袋模型4.4词袋模型与词向量|08/26(2)准备文本并进行简单预处理。以下是三段来自年报的文本,我们要对这三段文本进行分词,然后去掉标点符号,去掉停用词,然后提取词干,也就是一个完整的文本预处理过程。doc_msft="""Microsoftisatechnologycompanywhosemissionistoempowereverypersonandeveryorganizationontheplanettoachievemore.

Westrivetocreatelocalopportunity,growth,andimpactineverycountryaroundtheworld.

Wearecreatingtheplatformsandtools,poweredbyartificialintelligence(“AI”),thatdeliverbetter,faster,andmoreeffectivesolutionstosupportsmallandlargebusinesscompetitiveness,improveeducationalandhealthoutcomes,growpublic-sectorefficiency,andempowerhumaningenuity.Frominfrastructureanddata,tobusinessapplicationsandcollaboration,weprovideunique,differentiatedvaluetocustomers."""

doc_verizon='''VerizonCommunicationsInc.(theCompany)isaholdingcompanythat,actingthroughitssubsidiaries(togetherwiththeCompany,collectively,Verizon),isoneoftheworld’sleadingprovidersofcommunications,technology,informationandentertainmentproductsandservicestoconsumers,businessesandgovernmententities.Withapresencearoundtheworld,weofferdata,videoandvoiceservicesandsolutionsonournetworksandplatformsthataredesignedtomeetcustomers’demandformobility,reliablenetworkconnectivity,securityandcontrol.'''

doc_uah='''TheCompanytransportspeopleandcargothroughoutNorthAmericaandtodestinationsinAsia,Europe,Africa,thePacific,theMiddleEastandLatinAmerica.UAL,throughUnitedanditsregionalcarriers,operatesacrosssixcontinents,withhubsatNewarkLibertyInternationalAirport("EWR"),ChicagoO'HareInternationalAirport("ORD"),DenverInternationalAirport("DEN"),GeorgeBushIntercontinentalAirport("IAH"),LosAngelesInternationalAirport("LAX"),A.B.WonPatInternationalAirport("GUM"),SanFranciscoInternationalAirport("SFO")andWashingtonDullesInternationalAirport("IAD").'''

#调用自定义函数,进行文本预处理

tokenized_msft=custom_tokenizer(doc_msft)

tokenized_verizon=custom_tokenizer(doc_verizon)

tokenized_uah=custom_tokenizer(doc_uah)

print(tokenized_msft)

print(tokenized_verizon)

print(tokenized_uah)#可以看到,这三段文本都被分割成了单词4.4.1Bagofwords词袋模型4.4词袋模型与词向量|09/26(3)从词到向量。我们利用sklearn库的CountVectorizer函数,将文本转换成词频矩阵。词频矩阵是一个稀疏矩阵,其中每一行代表一个文档,每一列代表一个词,每个元素代表该词在该文档中出现的次数。fromsklearn.feature_extraction.textimportCountVectorizer#导入CountVectorizer函数

documents=[doc_msft,doc_verizon,doc_uah]

#先调用fit方法,计算tf-idf,然后transform方法将文本转为词频矩阵,这个矩阵代表了每个单词在每个文档中出现的次数,顺序是按照文章本身单词出现的顺序排列的

count_vectorizer=CountVectorizer(tokenizer=custom_tokenizer)

count_vec=count_vectorizer.fit_transform(documents)

#这里打印出来文章的向量矩阵,代表了每个单词在每个文档中出现的次数

print(count_vec.toarray()[:,:])

#下面我们来计算一下三段文本之间的相似度,这里我们采用余弦相似度来计算

#导入余弦相似度函数

fromsklearn.metrics.pairwiseimportcosine_similarity

#计算余弦相似度

cosine_sim_matrix=cosine_similarity(count_vec)

print(cosine_sim_matrix)##可以看到,微软(Microsoft)和威瑞森(Verizon)同属科技公司,相似度最高,而美联航(UnitedAirlines)是一家航空公司,和前两家公司不同,所以相似度最低。4.4.1Bagofwords词袋模型4.4词袋模型与词向量|10/26

4.4.2词频-逆文档频率(TF-IDF)4.4词袋模型与词向量|11/26下面是代码实例和注释,许多变量来自于4.5.1节:#导入tf-idf向量化函数fromsklearn.feature_extraction.textimportTfidfVectorizer

#调用函数,将文本转换成tf-idf矩阵

tfidf_vectorizer=TfidfVectorizer(tokenizer=custom_tokenizer)tfidf_vecs=tfidf_vectorizer.fit_transform(documents)#上面计算的矩阵表示了每个词的tf-idf值,顺序是按照文章本身的顺序排列的

#查看前80个词干

print(tfidf_vecs[:10])print(tfidf_vectorizer.get_feature_names_out()[0:80])

4.4.2词频-逆文档频率(TF-IDF)4.4词袋模型与词向量|12/26利用同样的方法,我们可以计算TF-IDF矩阵的余弦相似度。tfidf_cosine_sim_matrix=cosine_similarity(tfidf_vecs)

#这里打印出来的是tf-idf矩阵的余弦相似度,和上面的词频矩阵的余弦相似度是类似的

print(tfidf_cosine_sim_matrix)4.4.2词频-逆文档频率(TF-IDF)4.4词袋模型与词向量|13/26词袋模型主要的缺点是,它丢失了单词的顺序信息。因此,如果两个句子中的单词相同,但是顺序不同,那么词袋模型将认为这两个句子是相同的。这在很多情况下是不合理的。例如,句子“cashflowsfromoperations”和“operationsfromcashflows”在词袋模型中是相同的,但是在语义上是不同的。因此,词袋模型在处理文本时有一定的局限性。为了克服以上缺点,我们引入另一个可以将文本转化向量的方法,Word2vec。Word2vec是一种基于神经网络的词嵌入技术,它可以将单词转换为向量。Word2vec的基本思想是,通过训练一个神经网络,让神经网络学习到单词的分布式表示。在Word2vec中,单词的分布式表示是一个向量,向量的维度是预先设定的。Word2vec的训练过程是一个无监督的过程,它的目标是最大化训练数据中所有单词的联合概率。Word2vec的训练过程可以使用两种方法,分别是CBOW和Skip-gram。CBOW是从上下文预测中心词,而Skip-gram是从中心词预测上下文。Word2vev默认使用Skip-gram方法。4.4.3Word2vec算法4.4词袋模型与词向量|14/26和之前的BOW和TF-IDF算法一样,Word2vec也需要文本数据进行训练。下面用代码进行说明:(1)定义相关函数并准备好数据。大家可以发现通常我们在处理文本时,第一步是导入程序包和准备自定义的函数,这些部分放在前面可以使代码更加简洁和易读。importre

importpandasaspd

importgensim

fromnltk.tokenizeimportword_tokenize

fromnltk.stemimportWordNetLemmatizer

fromnltkimportPorterStemmer

fromnltk.corpusimportstopwords

importstring

#这是我们需要训练的数据集,来自于美国上市公司年报文件的MD&A部分

df=pd.read_excel(r"mda.xlsx",sheet_name="Sheet2")

4.4.3Word2vec算法4.4词袋模型与词向量|15/26

#下面我们定义一个函数,用来对文本进行预处理defprocess_text(text):

#分词

tokens=word_tokenize(text)

#删除停用词和标点符号

stop_words=set(stopwords.words('english')+list(str

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论