构建这些项目,获得你的第一份开发工作!#2:马尔可夫链歌词生成器

2025-06-04

构建这些项目,获得你的第一份开发工作!#2:马尔可夫链歌词生成器

嗨,朋友们!你们可能知道“通过构建这些项目获得你的第一份开发工作”是什么意思(我不知道为什么我给它起了这么长的名字),但如果不知道的话,可以看看这篇文章

总结:按照这些教程(它们都附带一个简短的视频),在项目的基础上进行构建,成为一名开发者。这就像是一种保证赚钱的“写代码赚钱”的方式。这感觉太酷了!

这个马尔可夫链歌词生成器是我最喜欢的项目之一。基本上,它使用一种名为马尔可夫链的预测模型来生成你最喜欢的歌手的歌词。这些歌词有时会非常搞笑,因为它们听起来和歌手很像,但又……不完全一样。人工智能生成的东西完全符合我的幽默感,所以我真的花了好几个小时来嘲笑这些回复。说我蹩脚,我敢说你不敢。

马尔可夫链是最简单的预测模型——它只使用前一个状态来预测下一个状态。在我们的例子中,它只使用歌词中的前一个单词来预测下一个单词。

直接进入 GitHub 的代码,或观看此处2:20 教程视频

我觉得这就像那种食谱博客,你得先把那些东拉西扯的废话读完,才能看到真正的食谱。抱歉。我们开始吧。

步骤 1:安装依赖项

Python3 -点击此处下载

re- Python 的正则表达式库。我们将用它来抓取网站内容,查找歌词链接。

pip install re

urllib- URL 库。我们使用这个库从页面上抓取 HTML 代码并将其读入字符串。

pip install urllib

markovify- 这个库可以为我们生成马尔可夫链。

pip install markovify

步骤 2:创建一个供 markovify 读取的文件

我们将把所有艺术家的歌词放入一个文件中,以供 markovify 读取。

originalLyrics = open('lyrics.txt', 'w')

步骤 3:抓取歌词链接

这里,我们可以手动把所有歌词都录入到文件中,或者使用付费 API。不过这种方式更有趣。

我们将使用 AZLyrics 抓取您艺术家的歌词并将其放入lyrics.txt

我们首先要做的是访问 AZLyrics 上的艺术家页面,找到页面上所有链接到歌曲的链接。你可以看看 AZLyrics 上的 Coldplay 页面,了解我的意思(本教程中我们将使用 Coldplay。我不太明白为什么。)

使用该urllib库从艺术家页面请求 HTML,并使用 read 将其转换为字符串,以便我们可以轻松地在其中搜索链接。

url = "https://www.azlyrics.com/c/coldplay.html"
artistHtml = urllib.request.urlopen(url)
artistHtmlStr = str(artistHtml.read())
To find the links on the page, we’ll be using the re library we imported which will find all a link.

links = re.findall('href="([^"]+)"', artistHtmlStr)

现在你有了一个名为 的列表links,其中包含了艺术家页面上的所有链接!试着打印这些链接,看看会发生什么。

print(links)

注意到什么了吗?如果你浏览这些链接,你会发现所有歌词页面的链接都指向它(太棒了!),而且还有指向其他页面的链接,比如联系页面,甚至还有 CSS 文件。另外你应该注意到的是,所有歌词链接lyrics/coldplay中都包含这个字符串。

现在我们需要过滤这些链接,以便只获取歌词页面。创建另一个仅包含歌词链接的列表。

songLinks = []

我们将循环遍历links列表,选择包含该字符串的所有内容lyrics/coldplay并将它们附加到songLinks列表中。

还和我在一起吗?

for x in links:
    if "lyrics/coldplay" in x:
        songLinks.append(x)

在 for 循环外部打印一下songLinks,看看最终结果如何。太棒了——只有歌词链接!然而,我们还有一个问题。链接没有完整的 URL,只有结尾部分。而它们..里面有。在将链接添加到 songLinks 数组之前,我们需要将 URL 的开头部分附加到链接后面,并将其替换..为空字符串。更新你的 if 语句,如下所示。

for x in links:
    if "lyrics/coldplay" in x:
        x = x.replace("..", "")
        x = "https://www.azlyrics.com/" + x
        songLinks.append(x)

再次打印 songLinks,看看会发生什么。现在我们只剩下完整的歌词链接了。太棒了。

步骤 4:从歌词链接中抓取歌词

下一步是从songLinks列表的每个链接获取 HTML,找到实际的歌词而没有其他内容,然后将其保存到我们在步骤 1 中创建的文件中。好了,我们开始吧。

首先,我们需要遍历songLinks列表并抓取 HTML 代码,将其转换为字符串。我们已经在步骤 2 中为艺术家页面完成了这一步。

for x in songLinks:
    songHtml = urllib.request.urlopen(x)
    songHtmlStr = str(songHtml.read())

如果我们在这里打印songHtmlStr,歌曲页面上的所有内容都会被打印出来。我们不希望出现这种情况,否则我们的预测模型会从更多文本中获取信息,而不仅仅是歌词。结果会像“宝贝,联系我们,订阅新闻简报”一样。所以我们需要找到歌词在页面上的位置,并拆分字符串,这样我们只需要将歌词添加到文件中。

在 AZLyrics 上查看歌词页面,右键单击歌词所在部分。单击后inspect(或inspect element取决于您的浏览器),您会看到歌词从免责声明(“任何第三方内容……”)之后开始,到结束标签 结束</div>。因此,我们需要将字符串拆分两次——一次用于获取免责声明之后的所有 HTML,另一次用于获取 之前的所有 HTML </div>

幸运的是,Python 有一个非常简单的方法来分割字符串 - split()。split 函数接受一个参数,该参数是字符串中标记一个分割点结束和另一个分割点开始的文本。它返回一个字符串列表,但我们可以简单地获取该列表中的第一个或第二个元素。

为了在免责声明后拆分歌词,我们传递了两个参数 - 免责声明文本,1因为我们只想将字符串拆分两次,而不是在免责声明的每个实例中拆分。

split = songHtmlStr.split('content by any third-party lyrics provider is prohibited by our licensing agreement. Sorry about that. -->',1)

splitHtml然后我们在的实例中拆分新字符串,</div>再次只拆分一次,列表中的第一个项目将是我们的歌词!

split_html = split[1]
    split = split_html.split('</div>',1)
    lyrics = split[0]

试试打印这份lyrics列表——你会发现我们抓取了所有歌词!然而,我们还有一个问题。我们抓取了所有不需要的、像<br>\n这样的多余部分。使用 replace 方法,将这些部分替换为空字符串或任何你喜欢的字符串。我在视频中使用了这些,但它们并不完美——你可以自己编写!

lyrics = lyrics.replace('\\', '')
lyrics = lyrics.replace('\nn', '\n')
lyrics = lyrics.replace('<i>', '')
lyrics = lyrics.replace('</i>', '')
lyrics = lyrics.replace('[Chorus]', '')

现在我们要做的就是把这些歌词写入我们之前打开的文件中!循环完成后,我们将关闭文件——我们不再需要向其中写入任何内容。

整个 for 循环应该是这样的。

for x in songLinks:
    songHtml = urllib.request.urlopen(x)
    songHtmlStr = str(songHtml.read()) 
    split = songHtmlStr.split('content by any third-party lyrics provider is prohibited by our licensing agreement. Sorry about that. -->',1)
    splitHtml = split[1]
    split = splitHtml.split('</div>',1)
    lyrics = split[0]
    lyrics = lyrics.replace('<br>', '\n')
    lyrics = lyrics.replace('\\', '')
    lyrics = lyrics.replace('\nn', '\n')
    lyrics = lyrics.replace('<i>', '')
    lyrics = lyrics.replace('</i>', '')
    lyrics = lyrics.replace('[Chorus]', '')
    originalLyrics.write(lyrics)
originalLyrics.close()

第五步:生成新歌词

这一步是魔法发生的地方,但也是最简单的部分。Python 已经markovify为我们完成了一切!我们需要创建两个变量——一个用于存储新生成的歌词,另一个用于 markovify 读取的字符串变量。为了创建这个字符串,我们将使用 read() 函数读取lyrics.txt我们创建并填充了歌词的文件。这次,我们将以只读模式(“r”)打开它。

generatedlyrics = ()
file = open('lyrics.txt', 'r')
text = file.read()

我们将文本变量传递给 Markovify,以生成 Markovify 模型。这非常简单:

markovifyTextModel = markovify.Text(text)

现在我们需要做的就是使用 Markovify 模型生成一个句子。这个模型可以做很多事情,但我们将使用 make_sentence,这是一个 Markovify 方法,它只能预测一个句子。

generatedlyrics = markovifyTextModel.make_sentence()

打印生成的歌词,你会看到一些预测出来的酷玩乐队的歌词!这些歌词有时非常搞笑,有时甚至相当病态……我视频里的歌词是“我带走了我的儿子”。

重要提示:您可能希望将所有步骤放入不同的文件或函数中,或者在步骤 5 之前注释掉所有代码。您不需要lyrics.txt每次都创建一个新文件。

现在轮到你了!

为了充分利用这些教程,请尝试在此项目的基础上构建一些内容。以下是一些想法:

就这样!一个有趣、有意思、令人印象深刻的项目,你可以向雇主展示。完成后,请在推特上私信我,或者在这里留言,让我看看你的成果!

文章来源:https://dev.to/catmcgeecode/get-your-first-dev-job-by-building-these-projects-2-markov-chain-lyrics-generator-1kib
PREV
构建 RESTful API 的最佳实践
NEXT
面试问答解码 - # 1