GraphGists

xALasOQ

想法

作为一名十几岁女儿的父亲,这意味着我听了许多当前的音乐。Lady Gaga、泰勒·斯威夫特。最近都是关于 One Direction 的。“” 最近说“One Direction 在 2015 年占据了互联网”。有时我听到“这是一首悲伤的歌”或“这是一首快乐的歌”。我可以用 Neo4j 了解他们的音乐吗?能否从歌词中推导出任何情绪?我能让我女儿对此感兴趣吗?只有一个办法可以找到答案……

如何开始

第一步是更多地了解该组合。目前有四名成员,但在他们的大部分专辑中,有五名成员。哈里·斯泰尔斯、尼亚尔、利亚姆、泽恩和路易。他们发行了五张专辑,分别是《Four》、《Take me home》、《Up all night》、《Midnight memories》和《Made in the A.M.》。在女儿的帮助下,我们找到了一个包含所有歌曲歌词的网站。我发现,虽然一些歌曲文件包含有关谁演唱了哪一部分的信息,但许多文件都没有。我希望也许可以根据歌手来辅助情绪分析。也许哈里总是唱悲伤/分手歌曲(他确实与泰勒·斯威夫特约会过)。由于此信息不一致,我无法依赖它。

歌曲情绪?

我觉得能够按歌曲位置、行和列跟踪歌词非常重要。这样一来,人们就可以查询“在歌曲开头(0,0)最常出现的词是什么?某些词语组合(“我”和“你”)在同一行出现的频率是多少?最后一个问题可能有助于更好地理解情绪?”

工具

工具:Python、py2neo、R 和 RNeo4j。

模型

第一步是按专辑将歌曲整理到文件中。完成此操作后,Python 就可以轻松读取专辑列表、歌曲标题和歌词(单词)。图……

我决定一个“组合”节点将指代一个乐队或歌手。“组合”将由“成员”组成,“成员”是“艺术家”。对于乐队来说,这很好。我选择以相同的方式处理独唱艺人。因此,Lady Gaga 或泰勒·斯威夫特将被视为“组合”、“成员”和“艺术家”。

节点

  • 组合

  • 成员

  • 艺术家

  • 专辑

  • 歌曲

  • 歌词

关系

  • 专辑 BY 组合

  • 歌词 IN 歌曲

  • 歌曲 ON 专辑

  • 成员 ISA_ARTIST 艺术家

  • 组合 HAS_MEMBER 成员

对于图示,我将数据限制为每张专辑一首歌曲,并将歌词减少了三分之二。即使这样,仍然有 581 个歌词节点。有 232 个独特的单词。差异是由于单词重复但在不同位置。单词“你”在五首歌曲中出现了 28 次

查找包含单词“我的”的所有歌曲

MATCH (l:Lyric{name:"my"})-[r0:IN]-(s:Song) RETURN s.name,l.row,l.column

显示歌曲“If I Could Fly”中的不同歌词

MATCH (n:Lyric)-[r0:IN]-(s:Song{name:"If I Could Fly"}) RETURN distinct (n.name)
MATCH (l:Lyric)-[r0:IN]- (n:Song) where l.name =~ "(?i)said"  RETURN n,l

显示“Act My Age”中的所有歌词。

8S3nRcb

显示组合的所有艺术家和成员

fmWnbfS

显示所有专辑上的所有歌曲。对于图示,每张专辑只有一首歌曲。

f25Z6aL

显示组合的所有专辑和成员

m6HQKQY

显示歌曲“Kiss you”的所有歌词。一些歌词与其他歌曲有连接。这是因为这些歌词在相同的位置使用。“宝贝”这个歌词在“Kiss Me”和“What makes you beautiful”中在同一行和列中使用。

wSQO6cZ

一个查询,用于查找“我”和“你”这两个词在同一行的歌曲。该查询在 Python 中运行良好,因为我可以过滤掉返回值为 0 的值。此类型的搜索在查找短语、同一行的单词时会有所帮助。

match (l1:Lyric{name: 'I'}) --(s:Song)
match (l2:Lyric{name :'you'}) --(s:Song)
return case  when l1.row = l2.row then [l1,l2,s] else 0 end

结果

歌曲 Act My Age

歌词

0

3

3

3

实际歌词,第 3 行:“我可以在经历了这一切之后依靠你”

If I Could Fly

歌词

0

5

3

5

实际歌词,第 5 行:“我希望你倾听,因为我放下了戒心”

情绪和 R

虽然不是 R 专家,但我找到了有助于开始的示例。

下面是前十个最常见歌词的条形图。“我”和“你”很受欢迎。

NlItPkD

情绪最后要考虑的是情绪。使用正面和负面词语的简单过程,我想看看是否可以确定情绪。我没有找到我可以使用的歌曲词语列表,所以我选择使用 AFINN 列表。根据 Jeffrey Breen 和 Andy Bromberg 的示例,我能够获得一些结果。我没有将歌曲分成训练集和测试集,而是选择了两首歌曲并对其进行了处理。我的女儿认为“Best Song Ever”应该是快乐的,“If I Could Fly”应该是悲伤的。

该过程从查询开始

graph = startGraph("https://localhost:7474/db/data/") query = "MATCH (l:Lyric) -[r0:IN]-(n:Song{name:'best song ever'}) RETURN l.name"

ta = cypher(graph, query)

这返回了一个歌词列表。接下来,我计算了与 AFINN 列表中的正面或负面词语匹配的歌词数量。我将这些词语分为“reg”(1-3 级)和“very”(4-5 级),分别用于正面和负面。

使用 R 函数 naiveBayes() 和 predict()。该方法非常简单,但结果确实表明“Best Song Ever”比“If I Could Fly”更“快乐”。最好得到 One Direction 对此的意见。

“Best Song Ever” reg very positive 10 3 negative 3 0

“If I Could Fly” Reg very positive 1 0 negative 4 0

我注意到的一件事是简单的词语匹配是不够的。对于电影评论或电子邮件,这可能有效。歌曲更复杂。

示例。一首快乐的歌曲可能包含“我爱你”这句歌词,而一首悲伤的歌曲可能包含“我曾经爱你”这句歌词。两者都包含“爱”这个正面词语,但第二句歌词可以被视为悲伤的,失去的爱。这就是在同一行查询歌词可以提供帮助的地方。它比匹配正面和负面词语更复杂。

结论这很有趣,我也获得了一些父子时光。我想继续研究这个,看看通过考虑短语和关联词语可以做些什么。