예를 들어, 두 개의 문장이 있습니다:
ls = ['我永远喜欢三上悠亚', '三上悠亚又出新作了']
jieba 단어 분할에서 우리는 다음과 같은 효과를 얻을 수 있습니다:

키워드를 기반으로 동시발생 행렬을 구축할 수 있습니다:
['', '我', '永远', '喜欢', '三上', '悠亚', '又', '出', '新作', '了'] ['我', 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 will Always like Mikami Yua"를 보세요. 이 문장에서 "I"와 "forever"는 해당 [i][j] 및 [j][i]에 한 번 함께 나타납니다. 동시발생 행렬+ 1 등.
이러한 이유로 공발생행렬의 특징은 다음과 같다는 것을 알 수 있습니다.
[0][0] 공발생행렬은 비어있습니다.
공시행렬의 첫 번째 행과 첫 번째 열은 키워드입니다.
대각선은 모두 0입니다.
공시행렬은 실제로는 대칭행렬입니다.
물론 실제 작업에서는 이러한 시각화가 깨끗할 수 있도록 이러한 키워드를 정리해야 합니다.
각 기사의 키워드의 2차원 배열 data_array.
모든 키워드의 set_word입니다.
키워드 길이 + 1로 행렬 행렬을 만듭니다.
할당 행렬의 첫 번째 행과 열은 키워드입니다.
행렬 대각선을 0으로 설정합니다.
formatted_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()은(는) 두 구문 사이의 동시 발생 횟수를 계산합니다. 문구 사이의 친밀도를 설명하기 위한 텍스트
코드(여기서 찾고 있는 대각선 요소는 텍스트에 해당 필드가 나타나는 총 횟수입니다):
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)입력은 다음과 같은 계열입니다

Find Each 필드의 사전과 각 필드의 발생 횟수

가 최종적으로 df

여기서 코끼리가 위치한 열을 다음과 같이 나누면 코끼리의 발생 횟수가 높을수록 두 요소가 여러 번 함께 나타나는 것을 나타냅니다. 이 일련의 비율에서 두 요소 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 동시 발생 행렬을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!