互动媒体的大作业之一。似乎一整个学期都在和这十二个一打交道,尝试了看待一个简单书法作品的多种维度,也发掘了诸如拟人化、拟物化等在内的多种其他视角。然而,不到期末我们就永远不知道这些数据最后将会去向哪里、会被用来做什么。
——————————————————
1.任务主题
对全体同学的文艺创作进行文本分析、统计和数据可视化
2.任务要求
整理大家的作业数据,运用NLP技术(自然语言处理)对其进行分析,完成一篇图文结合的分析报告,特别是要分别对十二个“一”有关的文本分别进行统计。
最好直接调用现成的NLP库来实现;报告中若能将文本分析结果与之前的关于十二个”一“的感受评分数据对比分析更佳;
——————————————————
3.我们的工作
在本次实验中,我们依旧将我们的关注重心放在12个”一“的本身上。我们想要通过观测、提取以及分析测试者对于12个“一”的感知以及对于它们的不同认知感受来抽象出这些内容与书法本身的关系,并给出一套可视化的方案,以展示我们的工作。
我们的工作主要包含以下的方面:
1.首先,我们将对所有数据进行手动的整理规划,并采取一种较好的方式来对所有的数据进行重新存放。
2.其次,我们利用每一个”一“获得的测试者的描述和设定的文本,利用snownlp以及jieba库来实现数据分析。
3.在整理文章的过程中,我们发现并不是所有的测试者都对所有的12个一进行了设定策划,一部分同学只是从中选取了4-6个一为部分书法构思人设。我们因此产生疑问:是否这些被单独选出来的”一“更加具有独特性或者最为富有代表性?我们也对它进行了分析研究。
4.整理在2中得到的数据,分析结果并且将它们做一个较为完整的分析以及可视化。
我们的第一步是手动提取受试者的创作文本。由于每个人写的文章主观性极大,且文本结构、排版、思路都不一样甚至有一些并不规范,我们原来想通过某种方法用代码自动筛选、归类文本,但是结果并不尽如人意,因此我们还是选择了手动提取。
我们由于时间问题,选取了1703/1704班的40名受试者,我们阅读他们的创作文本,把对于每一个“一”的设定文字剪裁下来,对应到每一个“一”上。每一个受试者拥有一个目录,目录下存放每一个“一”的txt文本。
让我们先把十二个“一”摆上来。
可以看出,就算没有对它们进行仔细细致的研究,我们也可以一眼就发现它们的书写方式是不同的,有一些比较相近,而有一些在粗细、倾斜度等各方面都有较大的的差异,有的粗狂,有的纤细。但是对于力度以及它们表现的情感, 每个人都是不太一样的。
——————————————————
4.词频分析
我们需要知道每一个“一”受试者都给它们赋予了什么样的角色,其中一个方法就是分门别类地进行词频方面的研究。如果一个词在文本中频繁出现,如果它是一个名词,那么就很有可能是用户描绘的或者是拟人、拟物化的角色,这将除了为我们提供用户的故事版之外别无意义,因此比较重要且有用的是形容词。
因此,我们把所有数据中有关第一号“一”的部分连接成一段文字,然后对这段文字进行分词。分词完成后,我们需要根据它们的词性进行筛选,选出我们需要的形容词来。然后再统计、分析。
首先遍历每一个测试者文件夹中的文本文件:
for rootdir, dirs, files in os.walk(rootdir):
for dir in dirs:
dir_path = os.path.join(rootdir, dir) # 获取子目录路径
namesdir.append(dir_path)
sampleNum = len(namesdir)
# 获取每个人分析的一
for name in namesdir:
# print(name)
texts = os.listdir(name)
# 分类存放
for text in texts:
(filename, extension) = os.path.splitext(text)
text = os.path.join(name, text)
if filename == "1":
oneIndex1.append(text)
pass
......
......
......
if filename == "12":
oneIndex12.append(text)
pass
else:
pass
提取所有的文本,集合到一个txt:
textdir = None
TXT = []
for textdir in oneIndex12:
txt = None
try:
txt = open(textdir, encoding="ansi").read()
except UnicodeDecodeError:
try:
txt = open(textdir, encoding="utf-8").read()
except UnicodeDecodeError:
print("出错")
TXT.append(txt)
print(TXT)
进行分词并加载停用词表用以过滤掉不需要出现的中文单词:
"""
分词
"""
txt = "".join(TXT)
# 加载停用词表
stopwords = [line.strip() for line in open("stop.txt", encoding="utf-8").readlines()]
筛选形容词,计算词频 :
"""
词性分析
"""
counts = {} # 通过键值对的形式存储词语及其出现的次数
for x in psg.cut(txt):
# if word not in stopwords:
if x.flag.startswith('a'):
if len(x.word) == 1: # 单个词语不计算在内
continue
else:
counts[x] = counts.get(x, 0) + 1 # 遍历所有词语,每出现一次其对应的值加 1
items = list(counts.items()) # 将键值对转换成列表
items.sort(key=lambda x: x[1], reverse=True) # 根据词语出现的次数进行从大到小排序
for i in range(min(50, len(items))):
x, count = items[i]
print("{0:<5}{1:>5}".format(x.word, count))
结果是例如这样的输出:
这是我们对第12个“一”进行分析的结果。
这个“一”是这一号:
我们提取到词频较高的词“纤细”、“谨慎”、“细腻”等都可以对应上这个字形。
我们对所有的词频分析进行了一个词云图展现,这将有利于我们对这些所有的文本进行总体的把握和感知。
编号 | 一 | 词云图 |
---|---|---|
1 | ![]() | ![]() |
2 | ![]() | ![]() |
3 | ![]() | ![]() |
4 | ![]() | ![]() |
5 | ![]() | ![]() |
6 | ![]() | ![]() |
7 | ![]() | ![]() |
8 | ![]() | ![]() |
9 | ![]() | ![]() |
10 | ![]() | ![]() |
11 | ![]() | ![]() |
1 2 | ![]() | ![]() |
——————————————————
5.关键词抽取
基于textRank算法生成关键词。这样做的意义是我们能够从所有测试者提供的文本中得到这个“一”比较具有代表性的词汇,但是我们个人认为由于关键词计入名词和动词,对分析“十二个一”的特征来说干扰因素还是有些太过于明显,所以我们觉得它的意义并不是很大。不过也把结果放上来:
——————————————————
6.情感分析
受试者在进行创作的时候,自身的心情以及对这个“一”的喜好程度都会使得他在对文艺创作的时候带入自己的主观情感,也因此影响到他对于这个“一”的演绎和设定。
snowNLP提供了一种封装好的方法来检测文本的情绪状况,用于分析受试文本的情感那倾向。一般而言,人对情感倾向分为正面和负面。snowNLP能够对文本进行分析,提取出关键的带有情绪的词汇来累加计算整个文章的情绪指向。在文本中发现一个消极的词汇,结果就会减小,发现正向积极的词汇则会增加。最后我们得出一个情绪的分值,这个数值越接近1,表示人的情感倾向越偏向正面的、积极的,越接近0表示越消极、越负面。
我们对十二个一进行分析,得到的最终结果是:
编号 | 一 | 情绪值 |
---|---|---|
1 | ![]() | 0.937641821147647 |
2 | ![]() | 0.866497779143834 |
3 | ![]() | 0.782580641617419 |
4 | ![]() | 0.849064394112572 |
5 | ![]() | 0.758883835001596 |
6 | ![]() | 0.860064893889249 |
7 | ![]() | 0.891415268611471 |
8 | ![]() | 0.861417124824973 |
9 | ![]() | 0.880712433042183 |
10 | ![]() | 0.850743745166771 |
11 | ![]() | 0.856084233096879 |
12 | ![]() | 0.882050871980078 |
可以发现所有的“一”的文本,其情感倾向分值都稳定在0.85左右。这是一个好的现象,说明人们在创作的过程中积极的内容还是要大于负面的内容,于是赋予“一”的情绪情绪倾向也较为正面。
我们对它们稍作分析,可以看出,笔迹较为柔和、没有很多棱角的“一”,其情绪倾向都基本能够突破0.85,而分值低于0.82的,一般笔迹较粗、线条硬而没有变化。
分值最高的1号“一”很显然具备了舒展、平滑等优点而不失干脆果敢,大多数人在评判它的时候表现出来的情感倾向都是正面的。(好巧,我们也喜欢这个一。)
代码:
sum = 0
textdir = None
TXT = []
# 获取所有的1号“一”的词频
for textdir in oneIndex12:
txt = None
try:
txt = open(textdir, encoding="ansi").read()
except UnicodeDecodeError:
try:
txt = open(textdir, encoding="utf-8").read()
except UnicodeDecodeError:
print("出错")
# print(txt)
s = SnowNLP(txt)
sum += s.sentiments
print(sum / len(oneIndex12))
————————————————
7.文本分析中一个有意思的小点
上一节我们通过分析各个“一”的文本来对人们对于“一”的创作感知进行了一个体现。我们在分析的过程中还发现了一个问题。当时我们写作业的时候,部分人选择了第二个选题,即在所有的一中选择4个以上的“一”进行创作,而不是整体的、泛化的研究。在这样的情况下受试者究竟会优先选择哪些“一”来作为故事的主人公,也是一个值得关注的问题。这反映了多个“一”之间的相似程度、差异程度以及特征程度。
比如,当我们选择哪一些一来进行创作的时候,一般我们都不会挑选我们非常不喜欢的,其次,当我们发现有多个一给我们的感受比较相似的时候,我们就很有可能要花费一些时间来仔细斟酌我们的选择,而结果往往是,我们会选择这两者之间他更喜欢的。
此外,对于一些人而言,选取的角色需要体现角色的个性,所以他们可能会选择最富有个性的那些,而不是相似的那些。因此,当一个人选择了四个“一”来创作的时候,这四个“一”很有可能是最具有个性的四个,也有可能是最能代表这十二个“一”中几大维度的四个,总之,他们的相似度应该不会太高。
我们尝试一下提取它:
for rootdir, dirs, files in os.walk(rootdir):
for dir in dirs:
dir_path = os.path.join(rootdir, dir) # 获取子目录路径
namesdir.append(dir_path)
print(namesdir)
sampleNum = len(namesdir)
print("样本数:" + str(sampleNum))
# 获取每个人分析的一
for name in namesdir:
# print(name)
texts = os.listdir(name)
if len(texts) < 9:
# 分类存放
for text in texts:
(filename, extension) = os.path.splitext(text)
text = os.path.join(name, text)
if filename == "1":
oneIndex1.append(text)
pass
......
......
......
else:
pass
print(oneIndex1)
....
print(oneIndex2)
由此,我们选取那些选择了9个以下“一”的人(因为不知道为什么大家用的数据有些是不一样的,有些并没有出现在我们分析统计的那些“一”的范畴),小于9就说明他们没有全都选,而是只选择了一部分。让我们来看一下结果。
我们来看看这些被选了10次以上的“一”都有哪些。
1:10次
5:12次
7:12次
9:15次
其他的都被选了5次或者6次,非常平均。
这个结果符合我们的预期吗?
很显然,它符合。
第一个1作为在情感分析中夺冠的一个,被多次选择是不奇怪的。
第五个1是粗笔迹中比较出色的一个。参考词频分析的结果,厚重、稳重、冷静是它比较出色的特征提取,这与其他三个灵动、活泼、温柔等的关键词不同,作为它的特色是很有说服力的。
第7个一也是所有12个一中比较有特色的一个。作为唯一一个墨迹不明显、更硬朗更干脆、更加现代化的笔触成为了它在其余11个一中最有辨识度的一个。
第九个一刚好也是我们想选的,而且它不负众望地出现在了名单上。9号一是12个一中在起落笔锋上最有代表性的一个。它笔锋柔和、墨迹柔软潇洒,也可以说“最为花哨”,被选择是容易预见到的结果。
此外,我们在作业一中分析的到的数据:
.可以发现,这样的结果还是在我们预想范围内的,可以说是一个合理的分析结果了。
————————————————
7.总结心得
本来有过对这个测试的预想,但实际出来的结果,有在预料之中,也有在预料之外的。不过总体来说,我们认为我们采用各种方式限制分析结果的随机性、减少分析过程的干扰因素的做法还是比较成功的。
经过这样的分析,对这一整个学期做的“一”相关的研究已经不是那么仇恨了。甚至在进行数据分析的过程中还觉得数值分析挺有意思的。毕竟在统计学上,数据永远要比人的感觉来得更有说服力。