📜  它需要两个歌词分析 (1)

📅  最后修改于: 2023-12-03 15:09:22.969000             🧑  作者: Mango

主题: 它需要两个歌词分析

简介

在这个项目中,我们将写一个程序,用于分析两个不同的歌词并找出它们之间的相似之处。这个程序将会读取两个文本文件,分析它们的单词并比较它们的相似度。最终结果将会以 markdown 格式返回。

实现步骤
  1. 读取两个文本文件。
  2. 分别分词并去除停用词。
  3. 统计两个文本中每个词语出现的次数。
  4. 计算两个文本的 Jaccard 相似系数。
  5. 将结果按 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 格式的结果。具体调用方式可以根据实际情况进行调整。