Python自然语言处理分析《倚天屠龙记》,哪个才是真正的张无忌? ...

图灵汇官网

在机器学习领域中,自然语言处理是一个重要的分支,它面临着诸多挑战,如如何进行分词、识别实体关系等。本文作者使用 Jieba、Word2Vec 和 NetworkX 工具结合在一起,对《倚天屠龙记》进行了自然语言分析。作者希望通过这种方式提供一些新颖的观点。以下是本文的核心内容:

一、分析结果

通过对《倚天屠龙记》进行自然语言处理,我们得到了一些有趣的结果。书中人物张无忌有着多种称呼,如“张无忌”、“无忌”、“张教主”等。这些称呼反映了他在不同场合下的身份变化。

  • 张无忌:通用名字,人人都可以称呼。
  • 无忌:关系熟了之后,平辈或长辈可以称呼。
  • 无忌哥哥:过于亲密,一般不常用。
  • 张公子:礼貌尊称,如黄衫女子、汝阳王等。
  • 张教主:头衔,既表示尊重,也表明彼此不太熟悉。

值得注意的是,赵敏并未出现在上述网络关系图中,因为 Word2Vec 认为张无忌和赵敏的相似度并不高。这可能是因为小说中赵敏与张无忌的关系发展较为突然,而在现实中这种关系可能不会如此紧密。

二、实现过程

准备语料

  1. 《倚天屠龙记》文本文件
  2. 自定义分词词典(包括小说中的人物名,约180个)
  3. 停用词表

准备工具

  1. Python 标准库:Pandas, Numpy, Scipy
  2. 中文分词工具:Jieba
  3. 单词向量化工具:Word2Vec
  4. 网络图工具:NetworkX

数据预处理

  1. 文本文件转换为 UTF-8 编码格式
  2. 文本文件分句、分词(使用 Jieba)
  3. 文本文件分句、分词、分析词性(主要针对人名)
  4. 更新自定义词典,重新分词(整个过程需反复调整)
  5. 手动少量删除(例如:赵敏笑,应改为“赵敏笑”)

Word2Vec 训练模型

  1. 采用 300 个维度
  2. 过滤词频小于 20 次的词
  3. 滑动窗口大小为 20
  4. 下采样参数为 0.001

生成实体关系矩阵

  1. 使用 Word2Vec 模型填充实体关系矩阵
  2. N*N 维度,N 是人名数量

NetworkX 生成网络图

  1. 节点为人名
  2. 边表示两个人之间的关系

三、部分代码实现

```python import numpy as np import pandas as pd import jieba import jieba.posseg as posseg

数据分词和清洗

renmingfile = "yttljrenming.csv" jieba.loaduserdict(renmingfile) stopwordsfile = "stopwordshagongdakuozhan.txt" stopwords = pd.readcsv(stopwordsfile, header=None, quoting=3, sep="t").values[0]

corpus = "yttlj.txt" yttlj = pd.read_csv(corpus, encoding="gb18030", header=None, names=["sentence"])

def cutjoin(s): news = list(jieba.cut(s, cutall=False)) stopwordsextra = set([""]) for seg in news: if len(seg) == 1: stopwordsextra.add(seg) news = set(news) - set(stopwords) - stopwordsextra result = ",".join(news) return result

def extractname(s): news = posseg.cut(s) words = [] flags = [] for k, v in news: if len(k) > 1: words.append(k) flags.append(v) fullwf["word"].extend(words) full_wf["flag"].extend(flags) return len(words)

Word2Vec 向量化训练

numfeatures = 300 minwordcount = 20 numworkers = 4 context = 20 downsampling = 1e-3

from gensim.models import word2vec

modelfilename = 'yttljmodel.txt' model = word2vec.Word2Vec(sentences, workers=numworkers, size=numfeatures, mincount=minwordcount, window=context, sample=downsampling)

model.save(modelfilename)

建立实体关系矩阵

entity = pd.readcsv("combinedrenming.csv", header=None, indexcol=None) entity = entity.rename(columns={0: "Name"}) entity = entity.setindex(["Name"], drop=False)

ER = pd.DataFrame(np.zeros((entity.shape[0], entity.shape[0]), dtype=np.float32), index=entity["Name"], columns=entity["Name"]) ER["tmp"] = entity["Name"]

def check_nshow(x): nshow = yttlj["sentence"].str.count(x).sum() return nshow

ER["nshow"] = ER["tmp"].apply(check_nshow) ER = ER.drop(["tmp"], axis=1)

count = 0 for i in entity["Name"].tolist(): count += 1 if count % round(entity.shape[0] / 10) == 0: print("{0:.1f}% relationship has been checked".format(100 * count / entity.shape[0])) elif count == entity.shape[0]: print("{0:.1f}% relationship has been checked".format(100 * count / entity.shape[0]))

for j in entity["Name"]:
    relation = 0
    try:
        relation = model.wv.similarity(i, j)
        ER.loc[i, j] = relation
        if i != j:
            ER.loc[j, i] = relation
    except:
        relation = 0

ER.to_hdf("ER.h5", "ER")

NetworkX 展示人物关系图

import networkx as nx import matplotlib.pyplot as plt import pandas as pd import numpy as np import pygraphviz from networkx.drawing.nxagraph import graphvizlayout

生成网络图的具体代码略

```

通过以上分析,我们可以更好地理解《倚天屠龙记》中的人物关系,并且可以将这种方法应用于其他文本分析任务中。希望这些内容能够为读者带来一些启发和帮助。

本文来源: 图灵汇 文章作者: