GraphGists

xALasOQ

想法

作为一位十几岁女儿的爸爸,我听了很多流行音乐。Lady Gaga,Taylor Swift。最近全是One Direction。正如“”最近所说,“One Direction在2015年统治了互联网”。有时我听到“这是一首悲伤的歌”或“这是一首开心的歌”。我能用Neo4j从他们的音乐中学到什么?能否从歌词中得出某种情感倾向?我能让我的女儿对此产生兴趣吗?只有一种方法可以知道…​

如何开始

第一步是了解更多关于这个乐队的信息。目前有四名成员,但他们的大多数专辑都是五人时期。Harry Stiles, Niall, Liam, Zayn和Louis。他们已经发行了五张专辑:Four、Take me home、Up all night、Midnight memories和Made in the A.M.。在我女儿的帮助下,我们找到了一个包含所有歌曲歌词的网站。我发现,虽然有些歌曲文件包含关于谁演唱哪个部分的信息,但很多都没有。我曾希望通过了解演唱者来帮助判断情感倾向。也许Harry总是唱悲伤/分手歌曲(他确实和Taylor Swift约会过)。由于这些信息不一致,我无法依赖它。

歌曲情感倾向?

我认为按歌曲中的位置、行和列来追踪歌词的能力很重要。这样就可以查询“在歌曲开头(0,0)出现最多的词是什么?某些词组合(‘I’和‘you’)在同一行出现的频率是多少?”最后一个问题可能有助于更好地理解情感倾向?

工具

工具:Python, py2neo, R和RNeo4j。

模型

第一步是按专辑将歌曲组织成文件。完成后,就可以很容易地让Python读取专辑列表、歌曲标题和歌词(词语)。图…​

我决定将Group节点指向一个乐队或歌手。一个Group由成员组成,而成员是Artist。对于乐队来说这很好。我选择以同样的方式对待单人艺人。所以Lady Gaga或Taylor Swift将被视为一个Group、Member和Artist。

节点

  • Group

  • Member

  • Artist

  • Album

  • Song

  • Lyrics

关系

  • Album BY Group

  • Lyric IN Song

  • Song ON Album

  • Member ISA_ARTIST Artist

  • Group HAS_MEMBER Member

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

查找包含词语“my”的所有歌曲

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

显示所有专辑中的所有歌曲。对于这个gist,每个专辑只有一首歌曲。

f25Z6aL

显示该团体的所有专辑和成员

m6HQKQY

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

wSQO6cZ

一个查询,用于查找单词“I”和“you”在同一行的歌曲。该查询在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

歌词

I

0

3

you

3

3

实际行,第3行:“I can count on you after all that we’ve been through”

If I Could Fly

歌词

I

0

5

you

3

5

实际行,第5行:“I hope that you listen 'cause I let my guard down”

情感倾向与R

虽然我不是R专家,但我找到了一些例子来帮助我入门。

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

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

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

例如。一首快乐的歌曲可能包含“I love you”这一行,而一首悲伤的歌曲可能包含“I used to love you”这一行。两句都包含积极词“love”,但第二句可以被视为悲伤,是失去的爱。这时,查询同一行的歌词会很有帮助。这比简单匹配积极词和消极词更复杂。

结论 这很有趣,我也借此和女儿度过了一段亲子时光。我想继续研究这个问题,看看通过考虑短语和关联词可以做些什么。

© . All rights reserved.