广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python共现矩阵如何实现
  • 455
分享到

python共现矩阵如何实现

Python 2023-05-14 22:05:19 455人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

什么是共现矩阵比如我们有两句话:ls = ['我永远喜欢三上悠亚', '三上悠亚又出新作了']在jieba分词下我们可以得到如下效果:我们就可以构建一个以关键词的共现矩阵:['', &#

什么是共现矩阵

比如我们有两句话:

ls = ['我永远喜欢三上悠亚', '三上悠亚又出新作了']

在jieba分词下我们可以得到如下效果:

python共现矩阵如何实现

我们就可以构建一个以关键词的共现矩阵:

['',    '我', '永远', '喜欢', '三上', '悠亚', '又', '出', '新作', '了']
['我',    0,      1,     1,     1,    1,    0,    0,      0,     0]
['永远',  1,      0,     1,      1,    1,    0,    0,     0,     0] 
['喜欢'   1,      1,     0,      1,    1,    0,    0,     0,     0]
['三上',  1,      1,     1,      0,    1,    1,    1,     1,     1]
['悠亚',  1,      1,     1,      1,    0,    1,    1,     1,     1]
['又',    0,      0,     0,      1,    1,    0,    1,     1,     1]
['出',    0,      0,     0,      1,    1,    1,    0,     1,     1]
['新作',  0,      0,     0,      1,    1,    1,    1,     0,     1]
['了',    0,      0,     0,      1,    1,    1,    1,     1,     0]]

解释一下,“我永远喜欢三上悠亚”,这一句话中,“我”和“永远”共同出现了一次,在共现矩阵对应的[ i ] [ j ]和[ j ][ i ]上+1,并依次类推。

基于这个原因,我们可以发现,共现矩阵的特点是:

  • 共现矩阵的[0][0]为空。

  • 共现矩阵的第一行第一列是关键词。

  • 对角线全为0。

  • 共现矩阵其实是一个对称矩阵。

当然,在实际的操作中,这些关键词是需要经过清洗的,这样的可视化才干净。

共现矩阵的构建思路

  • 每篇文章关键词的二维数组data_array。

  • 所有关键词的集合set_Word

  • 建立关键词长度+1的矩阵matrix。

  • 赋值矩阵的第一行与第一列为关键词。

  • 设置矩阵对角线为0。

  • 遍历fORMated_data,让取出的行关键词和取出的列关键词进行组合,共现则+1。

共现矩阵的代码实现

# coding:utf-8
import numpy as np
import pandas as pd
import jieba.analyse
import os
# 获取关键词
def Get_file_keywords(dir):
    data_array = []  # 每篇文章关键词的二维数组
    set_word = []  # 所有关键词的集合
    try:
        fo = open('dic_test.txt', 'w+', encoding='UTF-8')
        # keywords = fo.read()
        for home, dirs, files in os.walk(dir):  # 遍历文件夹下的每篇文章
            for filename in files:
                fullname = os.path.join(home, filename)
                f = open(fullname, 'r', encoding='UTF-8')
                sentence = f.read()
                words = " ".join(jieba.analyse.extract_tags(sentence=sentence, topK=30, withWeight=False,
                                                            allowPOS=('n')))  # TF-IDF分词
                words = words.split(' ')
                data_array.append(words)
                for word in words:
                    if word not in set_word:
                        set_word.append(word)
        set_word = list(set(set_word))  # 所有关键词的集合
        return data_array, set_word
    except Exception as reason:
        print('出现错误:', reason)
        return data_array, set_word
# 初始化矩阵
def build_matirx(set_word):
    edge = len(set_word) + 1  # 建立矩阵,矩阵的高度和宽度为关键词集合的长度+1
    '''matrix = np.zeros((edge, edge), dtype=str)'''  # 另一种初始化方法
    matrix = [['' for j in range(edge)] for i in range(edge)]  # 初始化矩阵
    matrix[0][1:] = np.array(set_word)
    matrix = list(map(list, zip(*matrix)))
    matrix[0][1:] = np.array(set_word)  # 赋值矩阵的第一行与第一列
    return matrix
# 计算各个关键词的共现次数
def count_matrix(matrix, formated_data):
    for row in range(1, len(matrix)):
        # 遍历矩阵第一行,跳过下标为0的元素
        for col in range(1, len(matrix)):
            # 遍历矩阵第一列,跳过下标为0的元素
            # 实际上就是为了跳过matrix中下标为[0][0]的元素,因为[0][0]为空,不为关键词
            if matrix[0][row] == matrix[col][0]:
                # 如果取出的行关键词和取出的列关键词相同,则其对应的共现次数为0,即矩阵对角线为0
                matrix[col][row] = str(0)
            else:
                counter = 0  # 初始化计数器
                for ech in formated_data:
                    # 遍历格式化后的原始数据,让取出的行关键词和取出的列关键词进行组合,
                    # 再放到每条原始数据中查询
                    if matrix[0][row] in ech and matrix[col][0] in ech:
                        counter += 1
                    else:
                        continue
                matrix[col][row] = str(counter)
    return matrix
def main():
    formated_data, set_word = Get_file_keywords(r'D:\untitled\test')
    print(set_word)
    print(formated_data)
    matrix = build_matirx(set_word)
    matrix = count_matrix(matrix, formated_data)
    data1 = pd.DataFrame(matrix)
    data1.to_csv('data.csv', index=0, columns=None, encoding='utf_8_sig')
main()

共现矩阵(共词矩阵)计算

共现矩阵(共词矩阵)

统计文本中两两词组之间共同出现的次数,以此来描述词组间的亲密度

code(我这里求的对角线元素为该字段在文本中出现的总次数):

import pandas as pd
def gx_matrix(vol_li):
    # 整合一下,输入是df列,输出直接是矩阵
    names = locals()
    all_col0 = []   # 用来后续求所有字段的集合
    for row in vol_li:
        all_col0 += row
	    for each in row:  # 对每行的元素进行处理,存在该字段字典的话,再进行后续判断,否则创造该字段字典
	        try:
	            for each2 in row:  # 对已存在字典,循环该行每个元素,存在则在已有次数上加一,第一次出现创建键值对“字段:1”
	                try:
	                    names['dic_' + each][each2] = names['dic_' + each][each2] + 1  # 尝试,一起出现过的话,直接加1
	                except:
	                    names['dic_' + each][each2] = 1  # 没有的话,第一次加1
	        except:
	            names['dic_' + each] = dict.fromkeys(row, 1)  # 字段首次出现,创造字典
    # 根据生成的计数字典生成矩阵
    all_col = list(set(all_col0))   # 所有的字段(所有动物的集合)
    all_col.sort(reverse=False)  # 给定词汇列表排序排序,为了和生成空矩阵的横向列名一致
    df_final0 = pd.DataFrame(columns=all_col)  # 生成空矩阵
    for each in all_col:  # 空矩阵中每列,存在给字段字典,转为一列存入矩阵,否则先创造全为零的字典,再填充进矩阵
        try:
            temp = pd.DataFrame(names['dic_' + each], index=[each])
        except:
            names['dic_' + each] = dict.fromkeys(all_col, 0)
            temp = pd.DataFrame(names['dic_' + each], index=[each])
        df_final0 = pd.concat([df_final0, temp])  # 拼接
    df_final = df_final0.fillna(0)
    return df_final
if __name__ == '__main__':
    temp1 = ['狗', '狮子', '孔雀', '猪']
    temp2 = ['大象', '狮子', '老虎', '猪']
    temp3 = ['大象', '北极熊', '老虎', '猪']
    temp4 = ['大象', '狗', '老虎', '小鸡']
    temp5 = ['狐狸', '狮子', '老虎', '猪']
    temp_all = [temp2, temp1, temp3, temp4, temp5]
    vol_li = pd.Series(temp_all)
    df_matrix = gx_matrix(vol_li)
    print(df_matrix)

输入是整成这个样子的series

python共现矩阵如何实现

求出每个字段与各字段的出现次数的字典

python共现矩阵如何实现

最后转为df

python共现矩阵如何实现

补充一点

这里如果用大象所在列,除以大象出现的次数,比值高的,表明两者一起出现的次数多,如果这列比值中,有两个元素a和b的比值均大于0.8(也不一定是0.8啦),就是均比较高,则说明a和b和大象三个一起出现的次数多!!!

即可以求出文本中经常一起出现的词组搭配,比如这里的第二列,大象一共出现3次,与老虎出现3次,与猪出现2次,则可以推导出大象,老虎,猪一起出现的概率较高。

也可以把出现总次数拎出来,放在最后一列,则代码为:

# 计算每个字段的出现次数,并列为最后一行
    df_final['all_times'] = ''
    for each in df_final0.columns:
        df_final['all_times'].loc[each] = df_final0.loc[each, each]

放在上述代码df_final = df_final0.fillna(0)的后面即可

结果为

python共现矩阵如何实现

以上就是python共现矩阵如何实现的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: python共现矩阵如何实现

本文链接: https://www.lsjlt.com/news/206502.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python共现矩阵如何实现
    什么是共现矩阵比如我们有两句话:ls = ['我永远喜欢三上悠亚', '三上悠亚又出新作了']在jieba分词下我们可以得到如下效果:我们就可以构建一个以关键词的共现矩阵:['', &#...
    99+
    2023-05-14
    Python
  • python共现矩阵怎么实现
    本篇内容主要讲解“python共现矩阵怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python共现矩阵怎么实现”吧!什么是共现矩阵比如我们有两句话:ls = [&#...
    99+
    2023-07-06
  • python 共现矩阵的实现代码
    目录python共现矩阵实现项目背景什么是共现矩阵共现矩阵的构建思路共现矩阵的代码实现共现矩阵(共词矩阵)计算共现矩阵(共词矩阵)补充一点python共现矩阵实现 最近在学习pyth...
    99+
    2022-11-11
  • python如何实现矩阵乘法
    小编给大家分享一下python如何实现矩阵乘法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!矩阵相乘需要前面矩阵的行数与后面矩阵的列数相同方可相乘。第一步,先将前面矩阵的每一行分别与后面矩阵的列相乘,作为结果矩阵的行列;第...
    99+
    2023-06-26
  • python实现矩阵乘法
    矩阵相乘需要前面矩阵的行数与后面矩阵的列数相同方可相乘。第一步,先将前面矩阵的每一行分别与后面矩阵的列相乘,作为结果矩阵的行列;第二步算出结果即可。 # 2 3 3 4 # 1 2 ...
    99+
    2022-11-12
  • 使用python实现矩阵
    文章目录 矩阵__init____getitem____setitem__reshape__repr____add__ 与 __mul____matmul__LU分解转置利用LU分解求行列式 ...
    99+
    2023-10-25
    python 矩阵 算法 学习
  • Python实现生成对角矩阵和对角块矩阵
    目录对角矩阵scipy中的函数numpy.diagflatnumpy.tri对角块矩阵对角矩阵 scipy中的函数 在scipy.linalg中,通过tri(N, M=None, k...
    99+
    2023-05-15
    Python生成对角矩阵 Python生成对角块矩阵 Python生成矩阵 Python矩阵
  • mat矩阵和npy矩阵实现互相转换(python和matlab)
    目录mat矩阵和npy矩阵互相转换numpy.narray矩阵保存为mat文件读取mat文件npy文件与mat文件的保存与读取1. npy文件2. mat文件mat矩阵和npy矩阵互...
    99+
    2022-11-11
  • python二维矩阵怎么实现
    Python中可以使用列表(list)来表示二维矩阵。可以通过嵌套列表的方式来表示二维矩阵的行和列。 以下是几种创建二维矩阵的方法:...
    99+
    2023-10-22
    python
  • python旋转矩阵怎么实现
    要实现矩阵的旋转,可以使用numpy库中的rot90函数。下面是一个简单的示例代码: import numpy as np # 创...
    99+
    2023-10-21
    python
  • php代码如何实现矩阵
    这篇文章主要介绍php代码如何实现矩阵,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php代码实现矩阵的方法:首先取出行数和列数;然后在外层循环控制圈数;接着通过“j=i;j<col-i;j++;j<; ...
    99+
    2023-06-14
  • NumPy如何实现矩阵乘法
    这篇文章主要介绍NumPy如何实现矩阵乘法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!NumPy 支持的几类矩阵乘法也很重要。元素级乘法你已看过了一些元素级乘法。你可以使用 multiply 函数或 * 运算符来实...
    99+
    2023-06-14
  • 如何利用Python实现n*n螺旋矩阵
    目录实现代码:运行结果:附:python 简单实现螺旋矩阵总结3*3螺旋矩阵: 1 2 3 8 9 4 7 6  5 实现代码: def spiral(n): ma...
    99+
    2022-11-12
  • 怎么使用Python实现生成对角矩阵和对角块矩阵
    这篇文章主要介绍了怎么使用Python实现生成对角矩阵和对角块矩阵的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Python实现生成对角矩阵和对角块矩阵文章都会有所收获,下面我们一起来看看吧。对角矩阵s...
    99+
    2023-07-06
  • 转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换
    文章目录 1. 转换矩阵、平移矩阵、旋转矩阵之间的关系2. 缩放变换、平移变换和旋转变换2. python实现旋转矩阵、四元数、欧拉角互相转化 由于在平时总是或多或少的遇到平移旋转的问题,...
    99+
    2023-09-17
    python 变换矩阵 旋转矩阵 欧拉角四元数 平移矩阵
  • mat矩阵和npy矩阵怎么实现互相转换
    这篇“mat矩阵和npy矩阵怎么实现互相转换”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mat矩阵和npy矩阵怎么实现互相...
    99+
    2023-07-02
  • Python列表矩阵转置怎么实现
    要实现Python列表的矩阵转置,可以使用zip函数。下面是一个示例代码:```pythondef transpose(matrix...
    99+
    2023-09-29
    Python
  • python实现邻接表转邻接矩阵
    目录python邻接表转邻接矩阵图的存储—邻接矩阵与邻接表邻接矩阵邻接表入度与出度书面练习编程练习总结python邻接表转邻接矩阵 闲话少说,前段时间看到有同学问怎么把邻...
    99+
    2022-12-16
    python邻接表 邻接表转邻接矩阵 python邻接矩阵
  • Matlab如何实现矩阵复制扩充
    考虑这个问题: 定义一个简单的行向量a 如何复制10行呢?即: 同理,对于一个列向量,如何复制 10 列呢? 关键函数1: repmat( A , m , n ):将向量/矩阵在...
    99+
    2022-11-12
  • C语言如何实现杨氏矩阵
    本篇内容主要讲解“C语言如何实现杨氏矩阵”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何实现杨氏矩阵”吧!题目如下:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作