从 Python 中的常用词词典的 SVD 打印散点图的问题

Problems to print out scatterplot from SVD of a dictionary of frequent words in Python

我可能在这里犯了很多错误。

我创建了这本词典,用于整理从两段文本中提取的常用词。

dims = {('1', 2,0),('beam',4,2),('electron',3,7),('electron-beam', 2,0),('focused',0,2),('generation', 2,0),('relativistic',0,2),('requirements',3,0),('sample', 0,2),('stringent', 2,0),('ultrafast', 0,5)}

第一个单词是数字“1”,它在 text1 中出现了 2 次,在 text2 中出现了 0 次。第二个词是 'beam',它在 text1 中出现了 4 次,在 text2 中出现了 2 次,依此类推。

我想得到两个texts.The中单词的svd(奇异值分解)的散点图texts.The最终结果应该是这样的:

找不到解决办法,于是开始破解任务:

就像创建一个只有数字的数组:

dinums = [[2,0],[4,2],[3,7],[2,0],[0,2],[2,0],[0,2],[3,0],[0,2],[2,0],[0,5]]

并且可以设法提取有意义的 SVD:

import scipy as sp

U, s, Vh = sp.linalg.svd(a)

这是包含结果的数据框:

svd_df = pd.DataFrame(U[:,0:2])
print(svd_df)
        0         1
0  -0.090641  0.300286
1  -0.353900  0.442893
2  -0.740124 -0.101449
3  -0.090641  0.300286
4  -0.172618 -0.157679
5  -0.090641  0.300286
6  -0.172618 -0.157679
7  -0.135962  0.450429
8  -0.172618 -0.157679
9  -0.090641  0.300286
10 -0.431545 -0.394199

我重命名了这些列,以便在散点图中使用它们:

svd_df = svd_df.rename(columns={0:'Abstr_1', 1:'Abstr_2'})

我打算绘制散点图(大失败!!!):

import seaborn as sns
import matplotlib.pyplot as plt

color_dict = dict({'Abstr_1':'Orange',
                   'Abstr_2':'Grey'})
# Scatter plot: SV1 and SV2
sns.scatterplot(x="Abstr_1", y="Abstr_2", 
                palette=color_dict, 
                data=svd_df, s=100,
                alpha=0.7)
plt.xlabel('Abstract 1:'.format(s), fontsize=10)
plt.ylabel('Abstract 2:'.format(s), fontsize=10)

这是否有助于您更接近您的想法?

备注:

  • 您的数据框在 运行 SVD(可能是共线性的标志)之后包含重复条目(例如索引 0、3、5、9),这是故意的吗?如果不是,请尝试不同的模型参数来改善输出。

  • color_dict = dict({'Abstr_1':'Orange','Abstr_2':'Grey'}) 令人困惑,(x, y) 形成一个点,您是否要为每个点绘制一半橙色和一半灰色?如果你想要点的不同颜色,你可以像我一样使用聚类(分组)。

  • 您可以使用.text来标记您的观点。请注意,由于重复的数据框条目,某些单词重叠。

代码

# your word list
words = ['one','beam','electron','electron-beam','focused',\
'generation','relativistic','requirements','sample','stringent','ultrafest']

# randomly assinging cluster for the purpose of demonstration
svd_df['Cluster'] = [0,1,0,1,1,0,0,1,0,1,0]

# at this stage your data frame looks like this
print(svd_df)
#      Abstr_1   Abstr_2  Cluster
# 0  -0.090641  0.300286        0
# 1  -0.353900  0.442893        1
# 2  -0.740124 -0.101449        0
# 3  -0.090641  0.300286        1
# 4  -0.172618 -0.157679        1
# 5  -0.090641  0.300286        0
# 6  -0.172618 -0.157679        0
# 7  -0.135962  0.450429        1
# 8  -0.172618 -0.157679        0
# 9  -0.090641  0.300286        1
# 10 -0.431545 -0.394199        0

color_list = ['Orange','Grey']

# Scatter plot: SV1 and SV2
g = sns.scatterplot(x='Abstr_1', y='Abstr_2', hue='Cluster',
                palette=color_list, 
                data=svd_df,s=100,
                alpha=0.7)

for x,y,z in zip(svd_df['Abstr_1'],svd_df['Abstr_2'],words):
    g.text(x,y+0.01,z)

plt.xlabel('Abstract 1', fontsize=10)
plt.ylabel('Abstract 2', fontsize=10)

输出