improve translation and csci-1100-hw-7

This commit is contained in:
JamesFlare1212
2024-09-21 10:59:36 -04:00
parent 7878b7623b
commit 7222828595
7 changed files with 590 additions and 167 deletions

View File

@@ -50,176 +50,137 @@ repost:
## 概述
作业在你的总作业成绩中占 100 分。截止日期为 2024 年 3 月 21 日星期四晚上 11:59:59。像往常一样会有自动评分分数、教师测试用例分数和助教评分分数的混合。这个作业只有一个"部分"
作业总共占你总作业成绩100分。它将于2024年3月21日晚上11:59:59截止。像往常一样,会有自动评分的部分、助教测试案例部分和TA评分的部分。这个作业只有一个“part”
请参阅提交指南和作政策手册,了解关于评分和过度协作的讨论。这些规则将在本学期剩余时间内生效。
请参阅手头文件中的提交指南和作政策了解关于评分的讨论以及什么被认为是过度的合作行为。这些规则在整个学期中都有效。
需要我们 `hw6_files.zip` 中提供的数据文件,所以务必从 Submitty课程材料部分下载文件并将其解压缩到你的 HW 6 目录中。该 zip 文件包含数据文件以及程序示例输入/输出。
你需要我们提供的数据文件 `hw6_files.zip`所以务必从Submitty课程材料部分下载文件并将其解压缩到你为作业6创建的目录下。zip 文件包含数据文件程序示例输入/输出。
## 问题介绍
有许多软件系统可以分析书面文本的风格和复杂程度,甚至可以判断两文档是否由同一人撰写。这些系统根据词汇使用的复杂程度、常用词以及紧密出现在一起的词来分析文档。在这个作业中,你将编写一个 Python 程序,读取包含两个不同文档文本的两个文件,分析每个文档,并比较这文档。我们使用的方法是自然语言处理 (NLP) 领域实际使用的更复杂方法的简化版本。
有许多软件系统用于分析书面文本的风格和复杂性,并且可以判断两文档是否由同一人撰写。这些系统根据词汇使用的复杂程度、常用词以及紧密相邻出现的词来分析文档。在这个作业中你将编写一个Python程序该程序读取两个包含不同文档内容的文件,每个文档进行分析,并比较这两个文档。我们使用的方法是自然语言处理NLP领域实际应用中的更高级方法的简化版本。
## 文件和参数
### 文件和参数
你的程序必须使用三个文件和一个整数参数。
你的程序必须三个文件和一个整数参数一起工作
第一个文件的名称对于你程序的每次运行都将是 `stop.txt`所以你不需要询问用户。该文件包含我们称为"停用词"的内容——应该忽略的词。你必须确保 `stop.txt` 文件你的 `hw6_sol.py` Python 文件在同一文件夹中。我们提供一个示例,但可能在测试你的代码时使用其他示例
第一个文件的名将是 `stop.txt`每次运行程序时都会用到这个文件名,因此你不需要向用户请求它。该文件包含我们称为停用词”的单词——应该忽略的词。你需要确保 `stop.txt` 文件位于你的 `hw6_sol.py` Python 文件所在的同一目录下。我们提供一个示例,但测试代码可能会使用其他不同的文件
你必须请求要分析和比较的两个文档的名称以及一个整数"最大分隔"参数,这里将称为 `max_sep`。请求应如下所示
必须请求两个文档的名字用于分析和比较以及一个整数参数“最大间隔”,这个参数将被称作 `max_sep`这些请求应该像下面这样
```text
Enter the first file to analyze and compare ==> doc1.txt
doc1.txt
Enter the second file to analyze and compare ==> doc2.txt
doc2.txt
Enter the maximum separation between words in a pair ==> 2
```text
输入要分析并比较的第一个文件名 ==> doc1.txt
doc1.txt
输入要分析并比较的第二个文件名 ==> doc2.txt
doc2.txt
输入单词对之间允许的最大间隔数 ==> 2
2
```
## 解析
### 解析
这个作业的解析工作是将文本文件分解为一个连续单词的列表。为此,应首先将文件内容拆分为字符串列表,其中每个字符串包含连续的非空字符。然后,每个字符串应删除所有非字母并将所有字母转换为小写。例如,如果文件的内容(例如 `doc1.txt`)被读取以形成字符串(注意行尾和制表符)
这个作业的任务是将一个文本文件解析成单个连续词组成的列表。为此,应首先将文件内容分割成字符串列表,其中每个字符串包含连续的非空字符。然后,需要从每个字符串中移除所有非字母字符,并将所有字母转换为小写形式。例如,如果读取了一个名为 `doc1.txt` 的文件(注意行尾和制表符)
```python
s = " 01-34 can't 42weather67 puPPy, \r \t and123\n Ch73%allenge 10ho32use,.\n"
```python
s = " 01-34 can't 42weather67 puPPy, \r \t and123\n Ch73%allenge 10ho32use,.\n"
```
然后拆分应产生字符串列表
那么分割结果应该得到字符串列表
```python
['01-34', "can't", '42weather67', 'puPPy,', 'and123', 'Ch73%allenge', '10ho32use,.']
```
并且这应该被拆分为(非空字符串列表
然后进一步解析为非空字符串列表
```python
['cant', 'weather', 'puppy', 'and', 'challenge', 'house']
```python
['cant', 'weather', 'puppy', 'and', 'challenge', 'house']
```
注意,第一个字符串 `'01-34'` 被完全删除,因为没有字母。所有三个文件——`stop.txt` 和上面称为 `doc1.txt``doc2.txt` 的两个文档文件——都应这种方式解析。
注意,第一个字符串 `'01-34'` 因为没有字母而完全被移除。所有三个文件——`stop.txt` 和两个文档文件 `doc1.txt` 和 `doc2.txt` ——都应按照这种方式进行解析。
完成此解析后,解析 `stop.txt` 文件产生的列表应转换集合。此集合包含在 NLP 中被称为"停用词"的内容——出现频率如此之高以至于应该忽略的词。
一旦完成这些解析步骤,从解析 `stop.txt` 文件得到的列表应转换集合。此集合包含自然语言处理NLP中所谓的“停用词”——在文本中出现频繁到可以忽略不计的词
`doc1.txt``doc2.txt` 文件包含要比较的两个文档的文本。对于每个文件,解析返回的列表应通过删除任何停用词来进一步修改。继续我们的示例,如果 `'cant'``'and'` 是停用词,那么单词列表应减少为
文件 `doc1.txt` 和 `doc2.txt` 包含要比较的两个文档的内容。对于每个文件,解析返回的列表应进一步通过移除所有停用词来修改。继续我们的示例,如果 `'cant'` 和 `'and'` 是停用词,单词列表应该被减少为
```python
['weather', 'puppy', 'challenge', 'house']
```python
['weather', 'puppy', 'challenge', 'house']
```
"and"这样的词几乎总是在停用词表中,而"cant"(实际上是缩写"can't")在某些列表中。请注意,从 `doc1.txt``doc2.txt` 构建的单词列表应保留为列表,因为单词顺序很重要。
"and" 这样的词几乎总是出现在停用词表中,而 "cant"(实际上是缩写形式的 "can't"在某些情况下会出现。注意,从 `doc1.txt` 和 `doc2.txt` 构建出来的单词列表应该保持为列表形式,因为单词顺序很重要。
### 分析每个文档的单词列表
一旦你生成了删除停用词的单词列表,你就可以分析单词列表了。有很多方法可以做到这一点,但以下是此作业所需的方法:
1. 计算并输出平均单词长度,精确到小数点后两位。这里的想法是单词长度是复杂程度的粗略指标。
一旦你生成了移除了停用词后的单词列表,就可以开始分析这个单词列表了。有许多方法可以完成这一点,但这里只列出本作业所要求的方法:
2. 计算并输出不同单词数与总单词数之比,精确到小数点后三位。这是衡量所使用语言多样性的一种方法(尽管必须记住,一些作者重复使用单词和短语以加强他们的信息。)
1. 计算并输出平均单词长度(保留两位小数)。这里的思路是,单词长度是一个粗略的语言复杂度指标。
3. 对于从 1 开始的每个单词长度,找到具有该长度的单词集。打印长度、具有该长度的不同单词数以及最多六个这些单词。如果对于某个长度,有六个或更少的单词,则打印所有六个,但如果有超过六个,则按字母顺序打印前三个和后三个。例如,假设我们上面的简单文本示例扩展为列表
2. 计算并输出不同词的数量与总词数量的比例(保留三位小数),这衡量了使用的语言的多样性(不过必须记住一些作者会反复使用某些词汇和短语来加强他们的信息)。
```python
['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']
3. 对于每个从1开始的单词长度找到具有该长度的所有单词集合。打印出这个长度、不同单词的数量并输出最多六个这些单词。如果对于某个特定长度有六或更少个单词则全部列出如果有超过六个则列出前三个和后三个按字母顺序排列。
4. 找到文档中的所有唯一单词对。一个单词对是一个两个元素的元组,在文档列表中距离不超过 `max_sep` 的位置出现的两个词构成。例如,如果用户输入导致 `max_sep == 2`,那么生成的第一个六个单词对是:
```python
('puppy', 'weather'), ('challenge', 'weather'),
('challenge', 'puppy'), ('house', 'puppy'),
('challenge', 'house'), ('challenge', 'whistle')
```
那么输出应该是
你的程序应该输出唯一单词对的总数,并且也应按字母顺序输出前五个和后五个单词对。你可以假设有足够的单词来生成这些对。
```text
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
```
5. 最终,作为衡量单词对独特性的指标,计算并输出(保留三位小数)唯一单词对的数量与总单词对数量的比例。
4. 找到此文档的不同单词对。单词对是文档列表中相隔 `max_sep` 个或更少位置出现的两个单词的二元组。例如,如果用户输入导致 `max_sep == 2`,那么生成的前六个单词对将是:
### 比较文档
```python
('puppy', 'weather'), ('challenge', 'weather'),
('challenge', 'puppy'), ('house', 'puppy'),
('challenge', 'house'), ('challenge', 'whistle')
```
最后一步是根据复杂性和相似性比较这两个文档。有许多可能的度量标准,我们将实现其中的一些。
你的程序应输出不同单词对的总数。(请注意,`('puppy', 'weather')` 和 `('weather', 'puppy')` 应视为相同的单词对。)它还应按字母顺序输出前 5 个单词对(而不是它们形成的顺序,上面写的就是这样)和最后 5 个单词对。你可以假设,无需检查,有足够的单词来生成这些对。以下是上面较长示例的输出(假设读取它们的文件名为 `ex2.txt`
```text
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
```
5. 最后,作为单词对的独特性的度量,计算并输出不同单词对的数量与单词对总数之比,精确到小数点后三位。
#### 比较文档
最后一步是比较文档的复杂性和相似性。有许多可能的度量方法,所以我们将只实现其中的一些。
在我们这样做之前,我们需要定义两个集合之间的相似性度量。一个非常常见的,也是我们在这里使用的,称为 Jaccard 相似度。这是一个听起来很复杂的名称,但概念非常简单(在计算机科学和其他 STEM 学科中经常发生这种情况)。如果 A 和 B 是两个集合,那么 Jaccard 相似度就是
在进行这个步骤之前我们需要定义两个集合之间的相似度测量方法。一个非常常见且在这里使用的叫做雅卡尔相似度Jaccard Similarity。这是一个听起来很高深但其实很简单的方法这种情况在计算机科学和其他STEM学科中经常出现。如果A和B是两个集合那么雅卡尔相似度就是
$$
J(A, B) = \frac{|A \cap B)|}{|A \cup B)|}
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 度量
简单的英语来说,就是两个集合的交集大小除以它们并集大小。例如,如果 $A$ 和 $B$ 相等,$J(A, B)$ = 1如果 $A$ 和 $B$ 没有共同元素(即不相交),则 $J(A, B)$ = 0。作为特殊情况如果一个或两个集合为空度量值为0。雅卡尔度量使用Python集合操作计算非常简单
以下是文档之间比较度量:
这里有一些文档之间比较度量标准
1. 决定哪个文档的平均单词长度更大。这是衡量哪个文档使用更复杂语言的粗略度量
1. 决定哪个文档具有更大的平均单词长度。这是一个粗略的语言复杂性的指标
2. 计算两份文档中整体词汇使用的雅卡尔相似度(保留三位小数)。
3. 对于每个单词长度,计算单词使用情况的雅卡尔相似度。输出也应精确到三位小数。
4. 计算单词对集合之间的雅卡尔相似度。输出应该准确到四位小数。我们研究的这些文档不会具有大量的成对相似性,但在其他情况下这是一个有用的比较度量。
2. 计算两个文档中总体单词使用的 Jaccard 相似度。这应精确到小数点后三位
请参考示例输出以获取详细信息
3. 计算每个单词长度的单词使用的 Jaccard 相似度。每个输出也应精确到小数点后三位。
## 备注
4. 计算单词对集之间的 Jaccard 相似度。输出应精确到小数点后四位。我们在这里研究的文档不会有实质性的对相似性,但在其他情况下,这是一个有用的比较度量
- 这个作业的重要部分是练习使用集合。最复杂的实例出现在处理每个单词长度的词集计算中。这需要你构建一个列表中的集合。列表第k项对应的集合应该包含长度为k的单词
- 排序两个字符串元组构成的列表或集合非常简单。(注意当你对集合进行排序时,结果是一个列表)产生的顺序是按元组的第一个元素字母顺序排列,对于并列的情况则按照第二个元素字母顺序。例如:
有关详细信息,请参阅示例输出。
```python
>>> v = [('elephant', 'kenya'), ('lion', 'kenya'), ('elephant', 'tanzania'),
('bear', 'russia'), ('bear', 'canada')]
>>> sorted(v)
[('bear', 'canada'), ('bear', 'russia'), ('elephant', 'kenya'),
('elephant', 'tanzania'), ('lion', 'kenya')]
```
## 注意事项
- 本作业的一个重要部分是练习使用集合。最复杂的情况发生在处理每个单词长度的单词集的计算时。这需要你形成一个集合列表。与列表中的条目 k 相关联的集合应该是长度为 k 的单词
- 对字符串的二元组列表或集合进行排序很简单。(请注意,当你对一个集合进行排序时,结果是一个列表。)产生的顺序是按元组的第一个元素按字母顺序排列,然后对于相同的元素,按第二个元素按字母顺序排列。例如,
```python
>>> v = [('elephant', 'kenya'), ('lion', 'kenya'), ('elephant', 'tanzania'), \
('bear', 'russia'), ('bear', 'canada')]
>>> sorted(v)
[('bear', 'canada'), ('bear', 'russia'), ('elephant', 'kenya'), \
('elephant', 'tanzania'), ('lion', 'kenya')]
```
- 只提交一个 Python 文件 `hw6_sol.py`。
- 我们分析中缺少的一个组成部分是每个单词出现的频率。使用字典可以很容易地跟踪这一点,但我们不会在这个作业中这样做。当你学习字典时,思考一下它们如何用于增强我们在这里所做的分析。
- 提交一个单一的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》不是全部
- Elizabeth Alexander 的诗歌《赞歌》。
- Maya Angelou 的诗歌《脉搏之晨》。
- William Shakespeare 的戏剧《哈姆雷特》中的一个场景。
- Dr. Seuss 的《帽子猫
- Walt Whitman 的《当紫丁香在门廊绽放时》(不包括全部内容
所有这些都可以在网上全文阅读。请访问poetryfoundation.org了解些诗人、剧作家和作者的一些历史。
所有这些都可以在线全文获取。请访问 poetryfoundation.org 了解些诗人、剧作家和作者的历史。
## 支持文件