Я бы сначала настроил что-то вроде следующего. Возможно, что-то добавить в токенизацию; хотя для вашего примера ничего не нужно.
text = """Barbara is good. Barbara is friends with Benny. Benny is bad."""
allwords = text.replace('.','').split(' ')
word_to_index = {}
index_to_word = {}
index = 0
for word in allwords:
if word not in word_to_index:
word_to_index[word] = index
index_to_word[index] = word
index += 1
word_count = index
>>> index_to_word
{0: 'Barbara',
1: 'is',
2: 'good',
3: 'friends',
4: 'with',
5: 'Benny',
6: 'bad'}
>>> word_to_index
{'Barbara': 0,
'Benny': 5,
'bad': 6,
'friends': 3,
'good': 2,
'is': 1,
'with': 4}
Затем объявите матрицу нужного размера (word_count x word_count); возможно, с использованием numpy
как
import numpy
matrix = numpy.zeros((word_count, word_count))
или просто вложенный список:
matrix = [None,]*word_count
for i in range(word_count):
matrix[i] = [0,]*word_count
отметить, что это сложно и что-то вроде matrix = [[0]*word_count]*word_count
не будет работать, как бы сделать список с 7 ссылок на тот же внутренний массив (например, если вы попробуете этот код, а затем выполните matrix[0][1] = 1
, вы найдете matrix[1][1]
, matrix[2][1]
и т. д. также будут изменены на 1).
Затем вам нужно просто перебрать свои предложения.
sentences = text.split('.')
for sent in sentences:
for word1 in sent.split(' '):
if word1 not in word_to_index:
continue
for word2 in sent.split(' '):
if word2 not in word_to_index:
continue
matrix[word_to_index[word1]][word_to_index[word2]] += 1
Тогда вы получите:
>>> matrix
[[2, 2, 1, 1, 1, 1, 0],
[2, 3, 1, 1, 1, 2, 1],
[1, 1, 1, 0, 0, 0, 0],
[1, 1, 0, 1, 1, 1, 0],
[1, 1, 0, 1, 1, 1, 0],
[1, 2, 0, 1, 1, 2, 1],
[0, 1, 0, 0, 0, 1, 1]]
Или, если вы хотите знать, что говорят частоту «Бенни» и «плохой» вы можете спросить matrix[word_to_index['Benny']][word_to_index['bad']]
.
В чем вопрос? –
Как создать матрицу из текста? – mumpy