CSCI 1100 - 作业 6 - 文件、集合和文档分析
概述
这个作业在你的总作业成绩中占 100 分。截止日期为 2024 年 3 月 21 日星期四晚上 11:59:59。像往常一样,会有自动评分分数、教师测试用例分数和助教评分分数的混合。这个作业只有一个"部分"。
请参阅提交指南和协作政策手册,了解关于评分和过度协作的讨论。这些规则将在本学期剩余时间内生效。
你将需要我们在 hw6_files.zip
中提供的数据文件,所以请务必从 Submitty 的课程材料部分下载此文件,并将其解压缩到你的 HW 6 目录中。该 zip 文件包含数据文件以及程序的示例输入/输出。
问题介绍
有许多软件系统可以分析书面文本的风格和复杂程度,甚至可以判断两个文档是否由同一个人撰写。这些系统根据词汇使用的复杂程度、常用词以及紧密出现在一起的词来分析文档。在这个作业中,你将编写一个 Python 程序,读取包含两个不同文档文本的两个文件,分析每个文档,并比较这些文档。我们使用的方法是在自然语言处理 (NLP) 领域实际使用的更复杂方法的简化版本。
文件和参数
你的程序必须使用三个文件和一个整数参数。
第一个文件的名称对于你程序的每次运行都将是 stop.txt
,所以你不需要询问用户。该文件包含我们将称为"停用词"的内容——应该忽略的词。你必须确保 stop.txt
文件与你的 hw6_sol.py
Python 文件在同一文件夹中。我们将提供一个示例,但可能在测试你的代码时使用其他示例。
你必须请求要分析和比较的两个文档的名称以及一个整数"最大分隔"参数,这里将称为 max_sep
。请求应如下所示:
|
|
解析
这个作业的解析工作是将文本文件分解为一个连续单词的列表。为此,应首先将文件的内容拆分为字符串列表,其中每个字符串包含连续的非空白字符。然后,每个字符串应删除所有非字母并将所有字母转换为小写。例如,如果文件的内容(例如 doc1.txt
)被读取以形成字符串(注意行尾和制表符)
|
|
然后拆分应产生字符串列表
|
|
并且这应该被拆分为(非空)字符串列表
|
|
请注意,第一个字符串 '01-34'
被完全删除,因为它没有字母。所有三个文件——stop.txt
和上面称为 doc1.txt
和 doc2.txt
的两个文档文件——都应以这种方式解析。
完成此解析后,解析 stop.txt
文件产生的列表应转换为集合。此集合包含在 NLP 中被称为"停用词"的内容——出现频率如此之高以至于应该忽略的词。
doc1.txt
和 doc2.txt
文件包含要比较的两个文档的文本。对于每个文件,从解析返回的列表应通过删除任何停用词来进一步修改。继续我们的示例,如果 'cant'
和 'and'
是停用词,那么单词列表应减少为
|
|
像"and"这样的词几乎总是在停用词列表中,而"cant"(实际上是缩写"can’t")在某些列表中。请注意,从 doc1.txt
和 doc2.txt
构建的单词列表应保留为列表,因为单词顺序很重要。
分析每个文档的单词列表
一旦你生成了删除停用词的单词列表,你就可以分析单词列表了。有很多方法可以做到这一点,但以下是此作业所需的方法:
-
计算并输出平均单词长度,精确到小数点后两位。这里的想法是单词长度是复杂程度的粗略指标。
-
计算并输出不同单词数与总单词数之比,精确到小数点后三位。这是衡量所使用语言多样性的一种方法(尽管必须记住,一些作者重复使用单词和短语以加强他们的信息。)
-
对于从 1 开始的每个单词长度,找到具有该长度的单词集。打印长度、具有该长度的不同单词数以及最多六个这些单词。如果对于某个长度,有六个或更少的单词,则打印所有六个,但如果有超过六个,则按字母顺序打印前三个和后三个。例如,假设我们上面的简单文本示例扩展为列表
1 2 3 4 5
['weather', 'puppy', 'challenge', 'house', 'whistle', 'nation', 'vest', 'safety', 'house', 'puppy', 'card', 'weather', 'card', 'bike', 'equality', 'justice', 'pride', 'orange', 'track', 'truck', 'basket', 'bakery', 'apples', 'bike', 'truck', 'horse', 'house', 'scratch', 'matter', 'trash']
那么输出应该是
1 2 3 4 5 6 7 8 9
1: 0: 2: 0: 3: 0: 4: 3: bike card vest 5: 7: horse house pride ... track trash truck 6: 7: apples bakery basket ... nation orange safety 7: 4: justice scratch weather whistle 8: 1: equality 9: 1: challenge
-
找到此文档的不同单词对。单词对是文档列表中相隔
max_sep
个或更少位置出现的两个单词的二元组。例如,如果用户输入导致max_sep == 2
,那么生成的前六个单词对将是:1 2 3
('puppy', 'weather'), ('challenge', 'weather'), ('challenge', 'puppy'), ('house', 'puppy'), ('challenge', 'house'), ('challenge', 'whistle')
你的程序应输出不同单词对的总数。(请注意,
('puppy', 'weather')
和('weather', 'puppy')
应视为相同的单词对。)它还应按字母顺序输出前 5 个单词对(而不是它们形成的顺序,上面写的就是这样)和最后 5 个单词对。你可以假设,无需检查,有足够的单词来生成这些对。以下是上面较长示例的输出(假设读取它们的文件名为ex2.txt
):1 2 3 4 5 6 7 8 9 10 11 12 13
Word pairs for document ex2.txt 54 distinct pairs apples bakery apples basket apples bike apples truck bakery basket ... puppy weather safety vest scratch trash track truck vest whistle
-
最后,作为单词对的独特性的度量,计算并输出不同单词对的数量与单词对总数之比,精确到小数点后三位。
比较文档
最后一步是比较文档的复杂性和相似性。有许多可能的度量方法,所以我们将只实现其中的一些。
在我们这样做之前,我们需要定义两个集合之间的相似性度量。一个非常常见的,也是我们在这里使用的,称为 Jaccard 相似度。这是一个听起来很复杂的名称,但概念非常简单(在计算机科学和其他 STEM 学科中经常发生这种情况)。如果 A 和 B 是两个集合,那么 Jaccard 相似度就是
$$ J(A, B) = \frac{|A \cap B)|}{|A \cup B)|} $$
用通俗的英语来说,它就是两个集合的交集大小除以它们的并集大小。举例来说,如果 $A$ 和 $B$ 相等,$J(A, B)$ = 1,如果 A 和 B 不相交,$J(A, B)$ = 0。作为特殊情况,如果一个或两个集合为空,则度量为 0。使用 Python 集合操作可以非常容易地计算 Jaccard 度量。
以下是文档之间的比较度量:
-
决定哪个文档的平均单词长度更大。这是衡量哪个文档使用更复杂语言的粗略度量。
-
计算两个文档中总体单词使用的 Jaccard 相似度。这应精确到小数点后三位。
-
计算每个单词长度的单词使用的 Jaccard 相似度。每个输出也应精确到小数点后三位。
-
计算单词对集之间的 Jaccard 相似度。输出应精确到小数点后四位。我们在这里研究的文档不会有实质性的对相似性,但在其他情况下,这是一个有用的比较度量。
有关详细信息,请参阅示例输出。
注意事项
-
本作业的一个重要部分是练习使用集合。最复杂的情况发生在处理每个单词长度的单词集的计算时。这需要你形成一个集合列表。与列表中的条目 k 相关联的集合应该是长度为 k 的单词。
-
对字符串的二元组列表或集合进行排序很简单。(请注意,当你对一个集合进行排序时,结果是一个列表。)产生的顺序是按元组的第一个元素按字母顺序排列,然后对于相同的元素,按第二个元素按字母顺序排列。例如,
|
|
-
只提交一个 Python 文件
hw6_sol.py
。 -
我们分析中缺少的一个组成部分是每个单词出现的频率。使用字典可以很容易地跟踪这一点,但我们不会在这个作业中这样做。当你学习字典时,思考一下它们如何用于增强我们在这里所做的分析。
文档文件
我们提供了上面描述的示例,我们将使用其他几个文档测试你的代码(其中一些是):
- Elizabeth Alexander 的诗《Praise Song for the Day》。
- Maya Angelou 的诗《On the Pulse of the Morning》。
- William Shakespeare 的《Hamlet》中的一个场景。
- Dr. Seuss 的《The Cat in the Hat》
- Walt Whitman 的《When Lilacs Last in the Dooryard Bloom’d》(不是全部!)
所有这些都可以在网上全文阅读。请访问poetryfoundation.org,了解这些诗人、剧作家和作者的一些历史。
支持文件
HW6.zip参考答案
hw6_sol.py
|
|
相关内容
- CSCI 1100 - 作业5 - 嵌套列表、网格和路径规划
- CSCI 1100 - 作业 4 - 循环和列表;密码和隔离
- CSCI 1100 - 作业 3 - 循环、元组、列表和条件语句
- CSCI 1100 - 作业2 - 字符串和函数
- CSCI 1100 - 作业 1 - 计算与字符串处理