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()
可以直观上感受出不同剧作的相似程度。