作者分析的应用场景
作者归属(authorship attribution)是作者分析的一个细分领域,研究目标是从一组可能的作者中找到文档真正的主人。这是一种典型的分类任务。作者分析任务一般采用标准的数据挖掘方法,比如交叉检验、特征抽取和分类算法等。
作者分析问题衍生出很多更细的问题,主要有以下几个:
- 作者画像: 根据作品界定作者的年龄、性别或其他特性。例如,通过观察一个人讲英语的方式,判断英语是否为他的母语。
- 作者验证:根据作者已有作品,推断其他作品是否也是他写的。拿法庭断案场景来讲更
好理解,例如,分析嫌犯的写作风格(内容方面),以确定勒索信是不是他写的。 - 作者聚类:作者验证问题的延伸,用聚类分析方法把作品按照作者进行分类。
不过,作者分析研究领域最常见的还是作者归属问题,即如何从一群作者中找到作品的真正
主人。
作者分析有很多应用场景,比如证实作者是谁,证实几本书有相同的作者,或者寻找社会媒
体账号的主人。
作者分析也并不是绝对可靠的。最近研究发现,即使没有经过专业训练的人,让他们隐藏自
己的写作风格,也会让作者归属问题变得困难无比。研究人员还探讨了模仿别人写作风格的问题,
结果发现人们模仿得很像,作者分析的结果是这些伪作出自被模仿人之手。
尽管存在很多问题,作者分析在越来越多的领域被证实十分有用,它是一个非常有意思的、
值得研究的数据挖掘问题。
会遇到的问题
作者归属可以看作是一种分类问题,已知一部分作者,数据集为多个作者的作品(训练集),
目标是确定一组作者不详的作品(测试集)是谁写的。如果作者恰好是已知的作者里面的,这种
问题叫作封闭问题。
如果作者可能不在里面,这种问题就叫作开放问题。不只是作者归属问题可以这样区分——
任何数据挖掘应用,只要实际的类别可能不在训练集中的都叫作开放问题,对于这类问题进行挖
掘,最终目标分两种情况,如果在训练集中,就返回找到的类别,如果不在,要给出不属于任何
现有类别的提示。
在进行作者归属研究时,一般会受到两个限制。一是只能使用作品的内容,而不能使用写作
时间、印刷形式、笔迹等信息。当然也有这样的做法,把这些信息整合到模型中,但一般来说这
就不是作者归属而更像是数据融合问题。
第二个限制是不考虑作品的主题;相反,关注单词用法、标点和其他文本特征。原因在于,
一个人如果是多面手,可以写多个主题的内容,作品的主题就不能反映作者的实际写作风格。
数据预处理
下面使用的图书资料来自于古腾堡计划(www.gutenberg.org),该网站收集了大量版权失效的公版文学作品。
数据我没下载下来,这里就不贴数据如何下载了,可以大致浏览一下数据结构的样式:https://archive.org/stream/personalnarrativ04657gut/pnpa110.txt
大体翻看一下下载的作品,你会发现大部分都包含很多噪音——从数据分析的角度看至少是
这样的。每篇作品前都有大段的声明文字,开始数据分析之前,得先把它们删掉。
我们可以直接从文件里将这些免责声明删除,但是丢失数据怎么办?我们可能会丢失先前做
过的改动,从而导致实验结果无法重现,因此,不如在加载文件时跳过这部分——这样再次用这
些文件做实验时,也能得到同样的结果(只要原文件没变)。代码如下:
def clean_book(document):
# 每篇作品前后各一行文字,用来标识作品的开头和结尾,作品前后为古藤堡的项目说明,
# 我们可以通过这两行找到作品内容
lines = document.split("\n")
start= 0
end = len(lines)
for i in range(len(lines)):
line = lines[i]
if line.startswith("*** START OF THIS PROJECT GUTENBERG"):
start = i + 1
elif line.startswith("*** END OF THIS PROJECT GUTENBERG"):
end = i - 1
# Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串
# 用换行符把所有行连接起来,得到作品内容
return "\n".join(lines[start:end])
功能词
功能词是作者分析问题最早使用的一类特征,到现在来看,在词袋模型中使用功能词做特征效果依然不错。功能词指的是本身具有很少含义,却是组成(英语)句子必不可少的成分。例如,单词this和which的意思不是由它们本身的含义所决定,而是由它们在句子中充当的角色来决定。与功能词相对的是实词,比如tiger就有明确的含义,当人们在句子中看到这个单词时,脑海中就会浮现出大型猫科动物老虎的样子。
有些功能词的用法并不总是清晰、明确的。因此,从经验来看,选用使用频率较高的功能词做特征比较好(在所有文档中使用频率高,而不仅是在单个作者的作品中)。通常而言,使用越频繁的单词,对于作者分析能提供更多有价值的信息。相反,使用频率较低的单词,更适合用来做基于内容的文本挖掘。
功能词的使用通常不是由文档内容而是由作者的使用习惯所决定,因此可以用它们来区分不同的作者。例如,很多美国人比较在意区分that和which在句子中的用法,澳大利亚等国家的人就不太在意。在使用这两个词的地方,有些澳大利亚人要么几乎无一例外地都用that,要么是which用得多一点。这样的不同点,再加上成千上万个其他的微小差别,就形成了用于作者分析的模型。
首先,创建功能词词汇表,用列表存储。至于确切来说哪些是功能词,哪些不是,有待商榷。
我从已发表的研究成果中找到下面这些功能词,它们还是比较可靠的。
unction_words = ["a", "able", "aboard", "about", "above", "absent"