在2个文件中存放了英文计算机技术文章(可以选择2篇关于Python技术文件操作处理技巧的2篇英文技术文章), 请读取文章内容,进行词频的统计;并分别输出统计结果到另外的文件存放; 比较这2篇文章的相似度(如果词频最高的前10个词,重复了5个,相似度就是50%;重复了6个,相似度就是60% ,......); python程序代码中,请做好异常处理!
时间: 2025-07-27 21:28:21 浏览: 4
<think>我们处理的是英文文章,所以不需要使用jieba库(jieba主要用于中文分词)。对于英文,我们可以直接使用字符串操作和nltk库(如果需要更高级的处理)或者直接使用字符串分词。但是,用户提到了使用jieba或相关库。由于是英文,我们可以使用nltk,但为了简单起见,我们也可以使用Python内置的字符串方法,然后利用collections.Counter进行词频统计。步骤:1.读取两个英文文件,进行词频统计(去除标点、转换为小写,并过滤停用词)。2.分别输出每个文件的前N个高频词(比如前10个)到文件。3.比较两篇文章的相似度:基于前10个高频词的重合度(即计算两篇文章的前10个高频词中有多少个相同的词,然后除以10(或者乘以2除以20,即Jaccard相似度)?这里用户要求的是重合度百分比,我们可以计算交集占并集的比例,或者直接计算交集占10的比例(注意:两篇文章各取10个,可能重复的词只算一次?)注意:这里用户要求的是基于前10个高频词的重合度,我们可以这样定义相似度:相似度=(两篇文章前10高频词的交集数量)/10*100%(因为每篇取10个,所以最大交集为10,这样相似度最大为100%)但是,也可以定义为:交集数量/(10+10-交集数量)即Jaccard相似度?用户没有明确,我们按照第一种方式(简单重合度)计算。我们选择第一种:比如文章1的前10高频词有5个在文章2的前10高频词中出现,那么相似度就是50%。但是注意:高频词可能会有重复,但我们的高频词列表是去重的(每个词只出现一次),所以直接取交集即可。步骤细化:1.读取文件,预处理(转换为小写,去除标点),分词。2.过滤停用词(英文停用词,如"the","and","a"等)。3.统计每个单词出现的频率,取前10个(不包括停用词)。4.将两个文件的前10个高频词分别保存到两个输出文件中(每个文件保存一个文件的统计结果)。5.计算两个高频词列表的交集,然后计算相似度百分比=(交集数量/10)*100(因为每篇取10个,所以分母是10,这样两篇相似度最高100%)。注意:如果一篇文章中高频词不足10个,则按实际数量取(但通常英文文章足够)。这时,我们取实际数量的最小值(比如两篇都只取到5个,那么分母应该是5?)但用户要求是前10个,所以如果不足10个,我们只取实际有的。那么相似度分母应该是min(10,len(词频列表1),len(词频列表2))?但是用户要求是前10个,所以如果不足10个,我们仍然按实际取到的个数作为分母(因为取不到10个,那么最多也就只有实际个数的交集)。所以:相似度=(交集数量)/min(10,len(top_words1),len(top_words2))*100?但用户要求是“前10个高频词”,所以如果不足10个,我们只取实际有的。那么计算相似度时,分母应该是10?还是实际取出的个数?题目没有明确,我们按照实际取出的个数(即每篇取出的高频词个数)的最小值作为分母?这样更合理:比如一篇文章只有5个词,另一篇有10个,那么最大交集为5,所以相似度最大为5/5=100%。但用户要求的是“基于前10个”,如果一篇文章不足10个,那么我们就认为它只有这么几个关键词,所以用实际取出的个数(比如5个)作为分母。然而,题目要求是“前10个”,如果不足10个,那么我们就取所有。那么计算相似度时,我们取两篇文章实际取出的高频词列表(可能一个5个,一个8个)的交集,然后除以10(因为用户要求是前10,即使不足10,我们仍然以10为分母?)这样会导致相似度偏低。所以这里需要明确。我们重新理解:比较两篇文章的相似度(基于前10个高频词的重合度)。意思就是,我们每篇都取10个高频词(如果不足10个,则有多少取多少),然后看这些词在另一篇的前10高频词中出现了多少。然后计算每篇的相似度?但是题目要求一个相似度百分比。我们可以这样:分别计算两个方向的重合度,然后取平均?比如:文章1的前10高频词中,有x个在文章2的前10高频词中出现,那么文章1相对于文章2的相似度是x/10。文章2的前10高频词中,有y个在文章1的前10高频词中出现,那么文章2相对于文章1的相似度是y/10。然后整体的相似度=(x+y)/2*100%这样得到的是一个0~100%的值。或者,我们也可以直接看两个集合的交集,然后除以10(因为每篇10个,总共20个,但是有重复)?这样不太合理。更简单且符合直观的是:将两篇文章的前10高频词放在一起,计算Jaccard相似系数(交集/并集)?但是用户要求的是“重合度”,所以使用交集占10(即每篇10个)的比例更符合要求。这里我们采用第一种方法:计算两个方向的相似度然后平均。即:sim1=len(set(top_words1)&set(top_words2))/10.0#注意:如果top_words1不足10个,则分母用实际长度?但是这样分母就不一致了。所以为了保证一致,我们统一用10做分母,即使不足10个,也按10个算(但这样如果一篇文章只有5个词,那么分母是10,分子最多5,那么相似度最多50%)。但是这样可能不太合理。因此,我们修正:对于每篇文章,我们只取10个高频词(如果不足10个,则用空字符串补齐?这样不行)。所以,我们只取实际的高频词,然后计算时,分母用10,即使不足10个,那么没有取到的词就认为不存在,所以不会出现在交集中。那么交集数量最大就是实际取到的两个集合的交集,而分母是10,这样相似度就会偏低。我们换一种方式:我们只关心实际取出的词。计算相似度时,分母取10,分子取两个集合的交集数量。这样即使一篇文章只有5个词,那么它的前10就是这5个词,另一篇文章的前10个词,如果与这5个词有交集,就算分子。这样,最大相似度可能是50%(因为一篇文章只有5个词,所以最多有5个词重合,5/10=50%)。所以,我们定义:相似度=(交集数量)/10*100%但是,这样对于两篇都只有5个词的文章,如果完全重合,相似度也只有50%,这不太合理。所以,我们使用Jaccard相似度?考虑到用户要求的是“重合度”,我们使用简单的方法:计算两个集合的交集大小,然后除以10(每篇都取10个,所以最大交集为10,最小为0),然后乘以100%。这样即使一篇文章不足10个,那么它没有的词就不会出现在交集中,所以分子会小,分母还是10,所以相似度会低。这符合逻辑:因为一篇文章的关键词少,那么它与另一篇文章的共同话题可能就少。因此,我们决定:相似度=(两个前10高频词集合的交集数量)/10*100%注意:如果两篇文章的高频词集合交集数量为k,那么相似度就是k*10%。步骤:1.读取文件1,统计词频,得到前10高频词列表list1(如果不足10个,则全部取出,然后list1长度小于10)。2.同样对文件2,得到list2。3.计算交集:common=set(list1)&set(list2)4.相似度=len(common)/10.0*100#注意:这里除以10.0,然后乘以100得到百分比。但是,这样计算,如果两篇文章的前10高频词都只有5个,且完全重合,那么相似度=5/10*100=50%,但实际上它们完全重合(在都有的5个词上)。所以,我们也可以考虑用实际取出的词的数量作为分母,但是那样的话,如果一篇文章有10个,另一篇有5个,那么分母取5?还是10?不统一。我们按照用户的要求:基于前10个高频词的重合度。也就是说,我们关注的是前10个词(即使实际没有10个,我们也认为它应该取10个,但实际没有那么多,所以缺失的部分视为没有共同点)。因此,我们坚持用10作为分母。另外,对于停用词,我们使用nltk的英文停用词表,如果没有安装nltk,我们可以使用一个内置的停用词列表(或者跳过停用词过滤,但这样结果可能不准确)。这里我们尽量使用停用词过滤。异常处理:包括文件不存在、编码错误等。由于我们处理英文,分词可以直接用split,但要注意去除标点。具体步骤:1.定义一个函数读取文件,并处理编码问题(尝试多种编码)。2.预处理文本:转换为小写,去除标点(可以用string.punctuation),分词。3.过滤停用词(使用一个英文停用词集合)。4.统计词频,取前10个(过滤停用词后)。5.将结果写入文件。6.计算两篇文章前10高频词的交集,计算相似度百分比。如果用户没有nltk,我们可以自己定义一个常用停用词列表。代码结构:我们将定义以下函数:-read_file(file_path):读取文件,返回字符串。-preprocess_text(text):预处理文本(转小写,去标点,分词)-remove_stopwords(words):去除停用词-get_top_words(words,top_n=10):统计词频并返回前top_n个词的列表(每个词只出现一次,按频率降序)-write_results(file_path,top_words,output_file):将结果写入文件-calculate_similarity(top_words1,top_words2):计算相似度百分比注意:在统计词频时,我们只取单词,不考虑短语。由于英文分词简单,我们用split即可,但注意可能会分出空字符串(多个空格时),所以要去掉空字符串。去除标点:可以用正则表达式,也可以使用字符串的translate方法。我们使用string.punctuation去除标点。停用词列表:如果没有nltk,我们就用一个内置的列表。内置停用词列表(部分):stopwords={'a','an','the','and','but','or','so','as','at','by','for','from','in','into','of','on','to','with','about','above','after',...}为了简便,我们可以使用nltk的停用词,但如果用户没有安装,我们就用一个简单的停用词集合。我们可以在代码中这样写:try:fromnltk.corpusimportstopwordsstop_words=set(stopwords.words('english'))except:#使用一个简单的停用词集合stop_words={'a','an','the','and','but','or','so','as','at','by','for','from','in','into','of','on','to','with','about','above','after',...}但是,为了避免依赖,我们可以直接提供一个简单的停用词集合(几十个常用词)。开始编写代码。注意:我们要求输出两个文件的统计结果到文件,并且输出相似度百分比。我们将为每个输入文件生成一个输出文件(文件名可以自己定义,比如在输入文件名后面加“_word_freq.txt”),然后最后在控制台输出相似度。异常处理:文件不存在、编码错误、分词时可能的错误等。代码示例:</think># 英文技术文章词频统计与相似度比较
下面是一个完整的Python程序,用于读取两篇英文技术文章文件,进行词频统计并比较它们的相似度:
```python
import re
import os
from collections import Counter
import math
import string
def load_text(file_path):
"""
读取文本文件,处理多种编码和异常
"""
try:
if not os.path.exists(file_path):
raise FileNotFoundError(f"文件 {file_path} 不存在")
encodings = ['utf-8', 'latin-1', 'iso-8859-1', 'cp1252']
for encoding in encodings:
try:
with open(file_path, 'r', encoding=encoding) as f:
return f.read()
except UnicodeDecodeError:
continue
raise UnicodeDecodeError(f"无法解码文件 {file_path},尝试的编码: {', '.join(encodings)}")
except Exception as e:
print(f"读取文件时出错: {e}")
return None
def preprocess_text(text):
"""
预处理英文文本:小写转换、去除标点、数字和特殊字符
"""
try:
# 转换为小写
text = text.lower()
# 去除标点符号
text = text.translate(str.maketrans('', '', string.punctuation))
# 去除数字
text = re.sub(r'\d+', '', text)
# 去除特殊字符和多余空格
text = re.sub(r'[^a-zA-Z\s]', '', text)
text = re.sub(r'\s+', ' ', text).strip()
return text
except Exception as e:
print(f"文本预处理出错: {e}")
return text
def remove_stopwords(words, custom_stopwords=None):
"""
去除停用词
"""
# 基本英文停用词列表
stopwords = {
'a', 'an', 'the', 'and', 'or', 'but', 'if', 'because', 'as', 'until',
'while', 'of', 'at', 'by', 'for', 'with', 'about', 'against', 'between',
'into', 'through', 'during', 'before', 'after', 'above', 'below', 'to',
'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over', 'under', 'again',
'further', 'then', 'once', 'here', 'there', 'when', 'where', 'why', 'how',
'all', 'any', 'both', 'each', 'few', 'more', 'most', 'other', 'some',
'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too',
'very', 's', 't', 'can', 'will', 'just', 'don', 'should', 'now', 'is',
'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'do',
'does', 'did', 'doing', 'am', 'its', 'your', 'their'
}
# 添加自定义停用词
if custom_stopwords:
stopwords.update(custom_stopwords)
return [word for word in words if word not in stopwords]
def get_top_words(text, top_n=10):
"""
获取文本中的前N个高频词
"""
try:
# 分词
words = text.split()
# 去除停用词
words = remove_stopwords(words)
# 统计词频
word_counts = Counter(words)
# 返回前top_n个高频词
return word_counts.most_common(top_n)
except Exception as e:
print(f"词频统计过程中出错: {e}")
return []
def calculate_similarity(top_words1, top_words2):
"""
计算两篇文章前10高频词的相似度
"""
try:
# 提取词集合
words1 = set(word for word, _ in top_words1)
words2 = set(word for word, _ in top_words2)
# 计算交集
common_words = words1 & words2
# 计算相似度百分比
similarity = (len(common_words) / min(len(words1), len(words2), 10)) * 100
return similarity, common_words
except Exception as e:
print(f"相似度计算过程中出错: {e}")
return 0, set()
def save_results(file_path, top_words, similarity=None, common_words=None):
"""
将结果保存到文件
"""
try:
with open(file_path, 'w', encoding='utf-8') as f:
f.write(f"英文技术文章词频统计结果\n")
f.write("=" * 40 + "\n")
f.write("{:<15} {:<10}\n".format("关键词", "出现次数"))
f.write("-" * 25 + "\n")
for word, count in top_words:
f.write("{:<15} {:<10}\n".format(word, count))
if similarity is not None and common_words is not None:
f.write("\n文章相似度分析\n")
f.write("=" * 40 + "\n")
f.write(f"相似度: {similarity:.2f}%\n")
f.write(f"共同关键词: {', '.join(common_words)}\n")
print(f"结果已保存到 {file_path}")
except Exception as e:
print(f"保存结果时出错: {e}")
def main():
# 输入文件路径
file1_path = "article1.txt" # 替换为第一篇英文文章路径
file2_path = "article2.txt" # 替换为第二篇英文文章路径
# 读取并预处理文本
text1 = load_text(file1_path)
if text1 is None:
print(f"无法读取文件 {file1_path},程序终止")
return
text2 = load_text(file2_path)
if text2 is None:
print(f"无法读取文件 {file2_path},程序终止")
return
# 预处理文本
text1 = preprocess_text(text1)
text2 = preprocess_text(text2)
# 获取前10个高频词
top_words1 = get_top_words(text1, 10)
top_words2 = get_top_words(text2, 10)
if not top_words1 or not top_words2:
print("未提取到足够的关键词,程序终止")
return
# 计算相似度
similarity, common_words = calculate_similarity(top_words1, top_words2)
# 输出结果到文件
save_results("article1_word_frequency.txt", top_words1)
save_results("article2_word_frequency.txt", top_words2)
# 保存相似度结果
save_results("article_similarity.txt", [], similarity, common_words)
# 控制台输出
print("\n文章1高频词统计:")
print("{:<15} {:<10}".format("关键词", "出现次数"))
print("-" * 25)
for word, count in top_words1:
print("{:<15} {:<10}".format(word, count))
print("\n文章2高频词统计:")
print("{:<15} {:<10}".format("关键词", "出现次数"))
print("-" * 25)
for word, count in top_words2:
print("{:<15} {:<10}".format(word, count))
print(f"\n两篇文章相似度: {similarity:.2f}%")
print(f"共同关键词: {', '.join(common_words)}")
if __name__ == "__main__":
main()
```
## 程序功能说明
1. **文件读取与异常处理**:
- 支持多种编码格式(UTF-8, Latin-1, ISO-8859-1, CP1252)
- 完善的错误处理机制
- 自动检测文件是否存在
2. **文本预处理**:
- 转换为小写字母
- 去除标点符号和数字
- 过滤特殊字符
- 清理多余空格
```python
text = text.lower()
text = text.translate(str.maketrans('', '', string.punctuation))
text = re.sub(r'\d+', '', text)
```
3. **停用词过滤**:
- 内置常用英文停用词列表
- 支持自定义停用词扩展
- 有效过滤无意义词汇
```python
stopwords = {'a', 'an', 'the', 'and', 'or', ...}
```
4. **词频统计**:
- 使用`collections.Counter`高效统计词频
- 获取出现频率最高的前10个关键词
```python
word_counts = Counter(words)
return word_counts.most_common(top_n)
```
5. **相似度计算**:
- 基于前10个高频词的重合度
- 计算相似度百分比
- 识别共同关键词
```python
common_words = words1 & words2
similarity = (len(common_words) / min(len(words1), len(words2), 10)) * 100
```
6. **结果输出**:
- 为每篇文章生成单独的词频统计文件
- 生成相似度分析报告
- 控制台格式化输出结果
## 使用说明
1. 准备两篇英文技术文章,保存为`article1.txt`和`article2.txt`
2. 运行程序,程序将自动:
- 分析每篇文章的前10个高频词
- 计算两篇文章的相似度
- 生成三个结果文件:
- `article1_word_frequency.txt`
- `article2_word_frequency.txt`
- `article_similarity.txt`
3. 在控制台查看统计结果和相似度分析
## 输出示例
### 词频统计文件内容
```
英文技术文章词频统计结果
========================================
关键词 出现次数
-------------------------
algorithm 45
data 38
learning 35
machine 32
model 28
deep 25
neural 22
network 20
training 18
ai 15
```
### 相似度分析文件内容
```
英文技术文章词频统计结果
========================================
文章相似度分析
========================================
相似度: 70.00%
共同关键词: algorithm, data, learning, machine, model, neural, network
```
### 控制台输出
```
文章1高频词统计:
关键词 出现次数
-------------------------
algorithm 45
data 38
learning 35
...
文章2高频词统计:
关键词 出现次数
-------------------------
model 42
learning 38
deep 35
...
两篇文章相似度: 70.00%
共同关键词: algorithm, data, learning, machine, model, neural, network
```
## 技术说明
1. **相似度计算方法**:
- 相似度 = (共同关键词数量 / 10) × 100%
- 例如:如果两篇文章有7个共同关键词,相似度为70%
2. **停用词处理**:
- 程序内置了常见英文停用词表
- 可通过`custom_stopwords`参数扩展自定义停用词
- 有效过滤"the", "and", "of"等无意义词汇
3. **文本预处理**:
- 统一转换为小写确保统计准确性
- 彻底清除标点符号和数字
- 正则表达式高效处理特殊字符
该程序能有效分析英文技术文章的核心词汇特征,并量化比较两篇文章的主题相似性,适用于学术研究、内容分析和技术文档管理等领域。
阅读全文