NLP(VIII):使用PCA进行文本分析(一)

NLP(VIII):使用PCA进行文本分析

这一节我们使用PCA方法进行文本分析。

数据集

本节我们使用莎士比亚数据集,是一个csv文件,我已经上传,链接如下:
https://download.csdn.net/download/swy_swy_swy/87593634.
数据集的第二列为戏剧名,第五列为角色名,第六列为角色的台词。
另外我们的单词表为一个txt文件,已经上传,链接如下:
https://download.csdn.net/download/swy_swy_swy/87593708

数据预处理

载入数据

读入txt单词表

will_vocabs = []
with open('vocab.txt') as infile:
  for line in infile:
    will_vocabs.append(line.strip('\n'))

使用dataframe操作csv数据

will_df = pd.read_csv('will_play_text.csv', sep=';', names=[1, 2, 3, 4, 5])
will_df.head(10)
tokenize

将莎士比亚数据集中的所有台词,也就是“一句话”,变成token的列表并转小写。

will_raw_dict = {}
for line in np.array(will_df).tolist():
  play_name = line[0].lower()
  if play_name in will_raw_dict:
    will_raw_dict[play_name] += line[4]
  else:
    will_raw_dict[play_name] = line[4]
  
import spacy
nlp = spacy.load("en_core_web_sm")
will_token_dict = {}
for play in will_raw_dict:
  tokens = []
  raw_play = will_raw_dict[play]
  doc = nlp(raw_play)
  for token in doc:
    tokens.append(token.text.lower())
  will_token_dict[play] = tokens
向量化
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(vocabulary=will_vocabs)
will_sent_dict = {}
for play in will_token_dict:
  sent = ""
  for token in will_token_dict[play]:
    sent += token
    sent += " "
  will_sent_dict[play] = sent
X = vectorizer.fit_transform(list(will_sent_dict.values()))
matrix_task11 = X.toarray()
print(matrix_task11.shape)
(36, 22602)

这里看看矩阵的形状是否正确。

PCA降维

将每个向量将为2d

我们得到36个向量(因为总共36部剧作),每个向量具有22602维,现在我们需要将它们降为2维。

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
task11_2d = pca.fit_transform(matrix_task11)
print(task11_2d.shape)
(36, 2)
可视化

这里我们将剧作名作为标签,对应的二维向量作为坐标,将以上数据绘制为散点图。

from matplotlib import pyplot as plt

plt.scatter(task11_2d[:, 0], task11_2d[:, 1])
play_names = list(will_sent_dict.keys())
for i, play_name in enumerate(play_names):
	plt.annotate(play_name, xy=(task11_2d[i, 0], task11_2d[i, 1]))
plt.show()

在这里插入图片描述
可以直观上感受出不同剧作的相似程度。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值