📅  最后修改于: 2023-12-03 15:09:22.969000             🧑  作者: Mango
在这个项目中,我们将写一个程序,用于分析两个不同的歌词并找出它们之间的相似之处。这个程序将会读取两个文本文件,分析它们的单词并比较它们的相似度。最终结果将会以 markdown 格式返回。
下面是示例代码片段:
import re
from collections import Counter
def read_file(file_path: str) -> str:
with open(file_path, 'r', encoding='utf-8') as f:
return f.read()
def tokenize(text: str) -> list[str]:
# 去除非字母字符并转换成小写字母
text = re.sub('[^a-z]+', ' ', text.lower())
# 分词
return text.split()
def remove_stop_words(words: list[str], stop_words: set[str]) -> list[str]:
# 去除停用词
return [word for word in words if word not in stop_words]
def count_words(words: list[str]) -> dict[str, int]:
# 统计每个词语的出现次数
return Counter(words)
def calculate_jaccard_similarity(set1: set, set2: set) -> float:
# 计算 Jaccard 相似系数
intersection = set1 & set2
union = set1 | set2
return len(intersection) / len(union)
def analyze_lyrics(file1: str, file2: str, stop_words: set[str]) -> str:
# 读取两个文件
text1 = read_file(file1)
text2 = read_file(file2)
# 分词并去除停用词
words1 = remove_stop_words(tokenize(text1), stop_words)
words2 = remove_stop_words(tokenize(text2), stop_words)
# 统计词频
count1 = count_words(words1)
count2 = count_words(words2)
# 计算 Jaccard 相似系数
set1 = set(count1.keys())
set2 = set(count2.keys())
similarity = calculate_jaccard_similarity(set1, set2)
# 拼接 markdown 格式的结果
result = f'## 两个歌词的 Jaccard 相似度为:{similarity:.2f}\n\n'
result += '| 词语 | 歌词 1 出现次数 | 歌词 2 出现次数 |\n'
result += '| ---- | ---- | ---- |\n'
for word in set1 | set2:
count_str1 = str(count1.get(word, 0))
count_str2 = str(count2.get(word, 0))
result += f'| {word} | {count_str1} | {count_str2} |\n'
return result
以上代码实现了对两个歌词进行分词、去除停用词、统计词频、计算相似度、生成 markdown 格式的结果。具体调用方式可以根据实际情况进行调整。