Синтаксический разбор предложения с помощью алгоритмов кластеризации
Сак Александр Николаевич,
кандидат филологических наук, доцент, доцент кафедры иностранных языков и профессиональной коммуникации, Национальный исследовательский Московский государственный строительный университет E-mail: SakAN@mgsu.ru
Применение машинного обучения в лингвистике достигло очень высокого уровня. Используются мощнейшие нейронный сети для машинного перевода, анализа и генерации текста. Тем не менее, есть место для использования легковесных инструментов для анализа предложения. В статье рассматриваются некоторые новейшие подходы к разработке системы машинного перевода для обработки специализированных текстов строительной отрасли как на русском, так и на английском языке. Теория графов является основой для автоматического анализа предложений и представления их структуры. На первом этапе предложение изображается линейным графом. В статье рассматриваются методы кластеризации, применяемые на разных этапах обработки предложения для нахождения наиболее адекватного принципа разделения предложения по членам предложения с последующим построением дерева зависимостей. Для предварительной обработки предложения используются графовые сверточные нейронные сетей (ГНС). Кластеризация производится на основе обычного метода к-средних, а также спектральной кластеризации.
Ключевые слова: теория графов, синтаксис, семантика, графовые сверточные нейронные сети, кластеризация, спектральная кластеризация.
Введение
В предыдущих исследованиях [1] мы использовали графовую сверточную сеть (GCN) для определения частей речи в предложении. Несмотря на то, что каждое слово получает соответствующие начальные вложения (признаки), обработка GCN является очень мощным инструментом, поскольку она использует механизм распространения сигнала и учитывает связь каждого узла графа со всеми остальными узлами. Наибольшее влияние на узел оказывает ближайшее окружение, но определенное влияние на каждый элемент оказывают и более удаленные элементы. Влияние самых сильных элементов нейтрализуется с помощью обратной матрицы степени, чтобы избежать как взрыва градиента, так и затухания.
В нашей системе мы хотим свести к минимуму объектно-ориентированный подход и выбрать такую структуру данных, как словарь, чтобы не усложнять ситуацию. {'the': 'article', 'boy': ['noun'], 'needs': ['noun', 'verb'], 'his': ['pronoun'], 'wife': ['verb', 'adjective', 'noun'], 'more': ['adverb', 'adjective', 'noun'], 'than': 'preposition', 'anything': ['adverb', 'noun', 'pronoun'], 'else': ['adverb', 'adjective'], 'in': 'preposition', 'life': ['adjective', 'noun']}
Каждый элемент словаря содержит каждое слово предложения и все его употребления, взятые из онлайн-словаря.
Мы используем предложение «The boy needs his wife more than anything else in his life» в качестве теста для проверки качества перевода. У нас есть набор частей речи, распределенных по словам следующим образом (табл. 1).
Таблица 1. Распределение слов предложения по частям речи.
The Article
Boy noun
Needs noun verb
His Pronoun noun verb
Wife Adjective verb
More Adverb noun adjective
Than Preposition noun
Anything Adverb noun pronoun
Else Adverb adjective
In Preposition
Life Adjective noun
Хороший результат может быть получен даже без обучения матрицы весов, потому что даже слу-
о с
U со
чайным образом инициализированная GNN почти настолько же эффективная, как и обученная графовая сеть, в том, что касается классификации безымянного узла. Это можно объяснить тем фактом, что сама передача сигналов GNN уже эффективно кодирует информацию о соседстве. Соседние узлы в графе будут, как правило, иметь аналогичные признаки в GNN из-за структуры передачи сигналов, поэтому принудительное восстановление соседнего узла может быть просто избыточной. В таблице 1 показано распределение каждого слова в предложении по частям речи, полученное из онлайн-словаря.
В словаре собраны все возможные употребления этой лексемы, и в зависимости от ее возможных ролей в контексте устанавливаются значения, передающие гипотетическую смысловую нагрузку, которую может нести слово.
На входе мы предоставляем следующие признаки: раг^а!ие={'артикул':0.01,'предлог':0.02,'при лагательное':0.0795,'наречие':0.06,'местоимение': 0.085,'существительное':0.08,'глагол ':0,081}.
Для заполнения матрицы признаков, если слово играет разные роли во фразе, эти значения суммируются. У нас есть следующая матрица для нашего предложения: X=np.matrix( [[0.01-0.01] [0.09-0.09] [0.06-0.06] [0.085-0.085] [0.264-0.264] [0.225-0.225] [0.02-0.02] [0.235-0.235] [0.135-0.135] [0.02-0.02]) [0.165-0.165]]
Должна быть задана матрица смежности. В этот момент мы игнорируем структуру предложения, поэтому установим отношения каждой вершины со своими соседями. Слова в начале и конце предложения имеют формальную связь только с предыдущим и последующим словом соответственно, но им назначается связь с двумя предыдущим или двумя последующими словами для уравновешивания их значений. Этот прием называется padding и широко используется при анализе изображений.
В этом случае придумываем новые признаки по формуле [4] следующим образом: (1)
D=np.matrix([[3 0 0 0 0 0 0;0 3 0 0 0 0 0;0 0 3 0 0 0 0;0 0 0 3 0 0 0;0 0 0 0 3 0 0;0 0 0 0 0 3 0;0 0 0 0 0 0 3]]) D_hat=np.linalg.inv(D); W=np.matrix([[1-1;-1 1]]) First hidden layer: Z=D_hat*A_hat*X*W The output layer Z1=D_hat*A_hat*Z*W При умножении A*X сигнал каждого узла проходит через все элементы предложения, а признаки соседних узлов играют ключевую роль. Это означает, что каждый слой представлен
в GCN как набор своего окружения. В результате вершина не включает собственных эмбеддин-гов (признаков). Значит, вершина представляет собой набор признаков соседних вершин, т.е. только вершины с петлей включают в это множество свои собственные признаки. Чем выше степень вершины, тем больше ценность представленности их признаков, и наоборот, чем ниже степень вершины, тем меньше ценность ее признаков. Это может привести к исчезновению или взрывному росту градиентов. Это может вызвать нежелательный эффект при использовании алгоритмов стохастического спуска, которые используют для обучения сетей, и которые чувствительны к диапазону значений каждого входного признака. Чтобы решить эту проблему, мы добавляем единичную матрицу I к матрице смежности. Умножая матрицу смежности на обратную матрицу степени вершины D, представление объекта нормализуется. Сначала находится матрица степеней вершин для матрицы смежности, ее листинг приведен в коде программы: D=np.zeros((len(dict), len(dict))) for i in range(len(dict)): D[i, i]=3 D=np.matrix(D) D_hat=D**-1
Признаки каждой строки матрицы смежности делятся на степень вершины, соответствующей строке. Веса первого и второго слоев выбираются случайным образом и реализуются с помощью следующего кода:
W_1 = np.random.normal(loc=0, scale=1, size=(2,
2))
W_2 = np.random.normal(loc=0, size=(2, 2)) D_hat=np.linalg.inv(D);
Затем к каждому продукту применяется функция активации ReLu, реализованная с помощью следующего программного кода: H_1=D_hat*A_hat*X*W; H_2=D_hat*A_hat*Z*W
В результате на выходе второго слоя получаются следующие значения:
H_2=([[0.09444422 0.29017779] [0.09444422 0.29017779] [0.13681649 0.42036566] [0.20726677 0.63682261] [0.25389329 0.78008155] [0.26597534 0.81720339] [0.23466411 0.72100031] [0.2144139 0.65878201] [0.18718674 0.57512715] [0.17527486 0.53852815] [0.17527486 0.53852815]]) О том, как можно определить части речи слов в предложении с помощью полученной матрицы и метода косинусной схожести можно посмотреть в [1].
Сейчас же нас интересует, как можно разделить предложение на кластеры для его разбиения на части речи с последующим построением дерева зависимостей.
Методы исследования
Используя обычный алгоритм к-средних (k-means) мы получили следующий результат
при 4х кластерах. Мы видим, что результат кластеризации после прохождения двух слоев CGN лучще, чем использование матрицы признаков без обработки.
M from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=4) X=np.matrix(X) kmeans.fit(X[:]) colors=kmeans.labels_
print('the boy reeds his wife more than anything else in life') print('Clusters before passing features through C6N:',colors) kmeans.fit(H_2[:, ]) colors=kmeans.labels_
print('Clusters after passing the sentence through CGN:'jcolors)
the boy needs his wife more than anything else in life
Clusters before passing features through CGN: [21119020323]
Clusters after passing the sentence through CGIM: [1 1 1 9 2 2 0 0 3 3 3]
Как же работает это алгоритм?
def euclidian_dist(ve return np.sqrt(((
Евклидово расстояние - расстояние между двумерными векторами по кратчайшему пути. Это расстояние по прямой линии между задаваемыми нашими векторами двумя точками (вершинами/ острыми концами векторов). Его также называют L2-нормой, как длину разницы между двумя векторами. Буква L в L2 означает длину (length). Цифра 2 в L2 отражает показатель степени (квадрат), в котором возводятся измерения вектора разницы перед суммированием (и извлечением из суммы квадратного корня). Евклидово расстояние также называется RSS-расстоянием (SSE -the sum of squared Euclidian distances), то есть расстоянием (разницей) на основе корня из квадратов (root sum square).
Метод k-средних - это метод кластерного анализа, цель которого является разделение m наблюдений (из пространства Rn) на k кластеров, при этом каждое наблюдение относится к тому кластеру, к центру (центроиду) которого оно ближе всего. В качестве меры близости используется Евклидово расстояние. Рассмотрим ряд наблюдений
Метод k-средних разделяет m наблюдений на k групп (или кластеров) (k < m), чтобы минимизировать суммарное квадратичное отклонение точек кластеров от центроидов этих кластеров:
^i - центроид для кластера Si.
Если мера близости до центроида определена, то разбиение объектов на кластеры сводится к определению центроидов этих кластеров. Число кластеров k задается исследователем заранее.
Рассмотрим первоначальный набор k средних (центроидов) в кластерах. На первом этапе
Для начала надо познакомиться с Евклидовым расстоянием между двумя векторами
с1,уес2):
уес1-уес2)**2).5ит())
центроиды кластеров выбираются случайно или по определенному правилу (например, выбрать центроиды, максимизирующие начальные расстояния между кластерами).
Относим наблюдения к тем кластерам, чье среднее (центроид) к ним ближе всего. Каждое наблюдение принадлежит только к одному кластеру, даже если его можно отнести к двум и более кластерам.
Затем центроид каждого ^го кластера перевычисляется по следующему правилу:
Таким образом, алгоритм к-средних заключается в перевычислении на каждом шаге центроида для каждого кластера, полученного на предыдущем шаге.
Алгоритм останавливается, когда значения ^ не меняются:
Неправильный выбор первоначального числа кластеров к может привести к некорректным результатам. Именно поэтому при использовании метода к-средних важно сначала провести проверку подходящего числа кластеров для данного набора данных.
Как же установить количество кластеров? Решением может быть преобразование ядра для проецирования данных в более высокое измерение, где возможно линейное разделение. Версия этого ядра к-средних реализована в Scikit-Learn в оценщике SpectralClustering. Он использует граф ближайших соседей для вычисления многомерного представления данных, а затем присваивает метки, используя алгоритм к-средних:
сз о со -а
I=i А
—I
о
сз т; о m О от
З
ы о со
M from sklearn.cluster import SpectralClusteririg A=A_hat
D = np.diag(A.sum(axis=l)) L = D-A pninl ( L)
madel=SpectralClustering(n_cliisters=4,affinity= 'nearest_neighbors',n_rieighbors= ,assign_labels= ' kmearis') labels=model.fit_predict{L) prinl (strl00) labels
#pLt.scatter(H_2[:,0]J H_2[:,1], c=LabeLs, s=50, cmap='viridis ')
-1. -1. 0. Й. 0. Й. 0. я. 0. 0
-1. ?. -1. я. Я. 0. Й. 0. я. 0. Я
0. 1. -1. й. 0. Й. 0. я. 0. Я
й. 0. -1 . ?. -1. 0. Й. 0. я. 0. Я
й. 0. 0. -1. 7 . -1 . Й. 0. я. 0. й
й. 0. Я. 0. -1 . ? . -1 , 0. я. 0. я
й. 0. я. 0. Й. -1 . 7 , -1. я. 0. й
й. 0. я. 0. Я. 0. -1 , ?. -1, 0. я
й. О. я. 0. Я. 0. й. -1. 7. -1 . я
й. 0. я. 0. я. 0. й. 0. -1 , ? . -1
й. о. я. 0. я. 0. й. 0. -1 , -1 . 7
the boy needs his wife more than anything else in his life
Обычно используется 10 соседей для классификации, в нашем же случае только 3 ближайших соседа для определения, к какому кластеру относится данный элемент.
Также на рисунке представлен Лапласиан, полученный вычитанием матрицы смежности и ма-
трицы степени. Как мы видим классы разнородные и не соответствуют действительности.
Можно получить граф из матрицы признаков, полученной после2 х слоев графовой сверточной сети и, используя затем обычный метод к-средних, получить разбиение предложения на кластеры.
М from sklearn.cluster import SpectralClusteririg A = kneighbors_graph(H_2j n_neighbors = 3) . toarrayQ D = np .diag(A. suni(axis=l)) L = D-A print(L)
model=SpectralClustering(n_clusters= l,aff inity='nearest neighbors',n_neighbors=5,assign_labels= 1kmeans')
labels=model,fit_predict(L)
print(striee)
labels
#pLt.scatter(H_2[:j0]j H_2[:, 1], c=Labeis, s=50, cmap='viridis ')
Г ^ -1. -1. Pi. 0. 0. 0. 0. 0. -1. 0. ]
[-1. -1. 0. 0. 0. 0. 0. 0. -1. 0. ]
[-1. 0. ч. 0. 0. 0. 0. 0. й. -1. -1. ]
Г й' 0. я. 0. 0. -1 , -1 . -1 0. 0. ]
Г я. 0. я. 0. 3. -1. -1 , -1 . Й. 0. 0. ]
Г 0. я. 0. -1. -1 , -1 . й. 0. 0. ]
Г 0. 0. 1 . 1. 0. Ч , -1 . 0. 0. 0. ]
Г я- 0. 0. -1 . 0. 0. -1 , -1 0. 0. ]
Г 0. 0. -1 . 0. 0. 0. 0. -1 . -1. ]
Г 0. 0. 1 . 0. 0. 0. 0. -1 -1. ]
Г 0. 0. -1 . 0. 0. Я. 0. -1 -1 . 3, ]
the boy needs his wife more than anything else in his life
Мы получили матрицу смежности из H_2, затем получили Лапласиан. В итоге получаем такой результат:
аггау([2, 2, 3, 1, Q, 2, <д, 1, 2])
о с
u
со
Результат также оставляет желать лучшего.
Спектральная кластеризация использует информацию из собственных значений (спектра) специальных матриц, построенных из графа или набора данных.
Важнейшим является понятие собственных значений и собственных векторов. Для матрицы А, если существует вектор х, не состоящий только из нулей, и скаляр Л такой, что Ах = Лх, то говорят,
что x является собственным вектором матрицы A с соответствующим собственным значением Л.
Для нашего предложения мы получаем следующий набор собственных векторов и значений:
Eigenvector: [-0.30151134-0.30151134-
0.30151134-0.30151134-0.30151134-0.30151134
-0.30151 134-0.30151 134-0.30151 1340.30151134-0.30151134], Eigenvalue: -2.9075666824829844e-16
Eigenvector: [-3.88077881e-01-3.88077881e-01-3.41269961 e-01-2.53299847e-01
-1.34778034e-01 1.23926355e-16
1.34778034e-01 2.53299847e-01
3.41269961e-01 3.88077881e-01
3.88077881 e-01 ], Eigenvalue: 0.12061475842818319
Eigenvector:
[-0.37539552-0.37539552-
0.19974378 0.06937029 0.30602523 0.39948756
0.30602523 0.06937029-0.19974378-
0.37539552-0.37539552], Eigenvalue:
0.46791111376204386....
H from sklearn.cluster import KMeans A=A_hat
D = np.diag(A.sum(axis=l)) L = D-A
# находим собственные векторы и собственные значения valSj vecs = np.linalg.eig(L)
# сортируем
vecs = vecs[:,np.argsort(vals)] vals = vals[np.argsort(vals)]
# находим значение Фидлера для нахождения оптимального разреза графа для кластеризации for i, value in enumerate(vals):
print("Eigenvector:", vecs[:,i], Eigenvalue:value) #print('vecs='jVecs[:j1:6]) figjax=plt.subplots() for i3ii in enumerate(vals):
ax.scatter(i,ii) pit.xlabel('№ Собственного значения') pit.ylabel('Величина србственного значения') ax.grid () pit.show()
kmeans = KMeans(n_cliisters=4) kmeans.fit(vecs[:: ]) colors = kmeans.labels_
print('the boy reeds his wife more than anything else in life') print("Clusters:"j colors) print('-------')
Здесь мы используем Лапласиан на базе исходной матрицы смежности для нахождения собственных значений и собственных векторов. Затем мы можем графически представить собственные значения для определения связности графа
и количества кластеров. После этого используя обычный алгоритм к-средних, применяемых к собственным векторам, находим принадлежность каждого слова к определенному кластеру (рис. 1).
40 -
к s 3.5 -
<v
TO за -
m
о 2.5 -
о
I <ь 2.0 ■
1-
а 15
u
« X 10
3-
с; 05 ■
CD
00 •
•
•
4
0 г 4 6 £ 10
№ Собственного значения
Рис. 1. Величина собственного значения Первое собственное значение равно 0, потому что у нас есть только одна компонента связности (весь граф связан). Соответствующий собственный вектор всегда будет иметь постоянные значения (в этом примере все значения близки к -0,30).
Первое ненулевое собственное значение называется спектральной щелью. Спектральная щель дает нам некоторое представление о плотности графа. Если бы этот граф был плотно связным
(все пары из 10 узлов имели ребро), то спектральный разрыв был бы равен 10.
А в линейном графе, где каждая вершина связана ребром только с предыдущей и последующей вершиной и сама с собой, получаем следующую спектральную щель и соответствующий вектор:
Eigenvector: [-3.88077881e-01-3.88077881e-01-3.41269961e-01-2.53299847e-01
-1.34778034e-01 1.23926355e-16 1.34778034e-01 2.53299847e-01
3.41269961e-01 3.88077881e-01
3.88077881e-01], Eigenvalue: 0.12061475. Спектральный разрыв, равный 0.12 говорит о низкой связности графа. Второе собственное значение называется значением Фидлера, а соответствующий вектор - вектором Фидлера. Значение Фидлера аппроксимирует минимальный разрез графа, необходимый для разделения графа на две связанные компоненты. Напомним, что если бы наш граф уже состоял из двух компонент связности, то значение Фидлера было бы равно 0. В общем, требуется искать первый большой разрыв между собственными значениями, чтобы найти коли-
the boy needs his wife more Clusters: [2 22003331
чество кластеров, выраженных в наших данных. Есть разрыв между собственными значениями четыре и пять. Наличие четырех собственных значений перед разрывом указывает на то, что, вероятно, имеется четыре кластера. Векторы, связанные с первыми тремя положительными собственными значениями, должны дать нам информацию о том, какие три разреза необходимо сделать в графе, чтобы присвоить каждый узел одному из четырех аппроксимируемых компонентов.
Алгоритм распределил вершины следующим образом:
han anything else in life 1 1]
о с
u
со
Это распределение является наилучшим из тех, что мы пока видели. Главные элементы в этом сложном предложении the boy needs как группа подлежащего и his wife как прямое дополнение сгруппированы правильно. Второстепенные члены также хорошо распределены по кластерам.
Теперь мы можем попробовать превратить матрицу Н_2 в матрицу смежности и, получив рисунок собственных значений, определить количество кластеров и с помощью собственных векторов осуществить кластеризацию.
Как мы видим, разрывы между узлами на рисунке более четкие. Для нас также важен разрыв между 4 -м и 5 -м узлами. 3 кластера слишком мало. Мы видим, что кластеризация на основе полученной матрицы показала результат хуже, чем на основе Лапласиана на базе исходной матрицы смежности.
Выводы
В рамках решения задачи определения членов предложения мы рассмотрели применение обычной и спектральной кластеризации как для графов (матрица смежности), так и для произвольных данных (матрица Н_2). Если обычная кластеризация методом к-средних хорошо работает с линейными данными и представляет собой простой алгоритм и плохо работает с матрицами признаков как исходной, так и полученной, то спектральная кластеризация - это гибкий подход к поиску кластеров, когда данные не соответствуют требованиям других распространенных алгоритмов, т.к. в его основе
лежат чудесные свойства собственных значений и векторов Лапласиана. Это было показано при анализе сложного предложения на основе исходной матрицы смежности.
Литература
1. Сак А.Н. Моделирование системы машинного перевода на основе сравнения предложений, 2019 Журнал физики Материалы Конференций, 1425(1):012171, DOI: 10.1088/17426596/1425/1/012171
2. Сак А.Н. Специфика терминологии строительной отрасли и методы анализа сходства предложений естественного языка с использованием изоморфизма их структур, 2021, Материалы конференций, Материаловедение и инженерные науки, 1030(1):012079, DOI: 10.1088/1757-899Х/1030/1/012079
3. Сак А.Н. Парсинг с помощью графовых конво-люционных сетей и кластеризация, 2021 E3S
Сеть конференций, 263:03013, DOI: 10.1051/ e3sconf/202126303013
4. Алешинцев А., Сак А.Н. Анализ предложений естественного языка методами теории графов и теории множеств FRUCT>24: Труды 24-й конференции Ассоциации открытых инноваций FRUCT, апрель 2019, Статья № : 77, С. 556564.
5. Уильям Флешман. Спектральная кластеризация (Основание и применение) https:// towardsdatascience.com/spectral-clustering-aba2640c0d5b
SYNTACTIC PARSING OF A SENTENCE USING CLUSTERING ALGORITHMS
Sak A.N.
National Research Moscow State University of Civil Engineering
The application of machine learning in linguistics has reached a very high level. Powerful neural networks are used for machine translation, text analysis and generation. Nevertheless, there is room for using lightweight tools for sentence analysis. This article explores some of the latest approaches to developing a machine translation system for processing specialised construction texts in both Russian and English. Graph theory is the basis for automatic sentence analysis and representation of sentence structure. At the first stage the sentence is represented as a linear graph. The paper discuss-
es clustering techniques used at different stages of sentence processing to find the most adequate principle for dividing a sentence by its members, followed by the construction of the dependency tree. Graph convolutional neural networks (NCNs) are used for sentence pre-processing. Clustering is done based on the conventional k-means method as well as spectral clustering.
Keywords: graph theory, syntax, semantics, graph convolutional neural networks, clustering, spectral clustering.
References
1. A. Sak, Machine translation system modeling based on sentences comparison, 2019 Journal of Physics Conference Series 1425(1):012171, DOI: 10.1088/1742-6596/1425/1/012171
2. A. Sak, Specifics of construction industry terminology and methods of analysis of the natural language sentences similarity by using isomorphism of their structures, 2021, IOP Conference Series Materials Science and Engineering 1030(1):012079, DOI: 10.1088/1757-899X/1030/1/012079
3. A. Sak, Parsing with graph convolutional networks and clustering, 2021 E3S Web of Conferences 263:03013, DOI: 10.1051/ e3sconf/202126303013
4. A. Alyoshintsev, A. Sak, Analysis of Natural Language Sentences by Methods of the Theory of Graphs and the Theory of Sets FRUCT'24: Proceedings of the 24th Conference of Open Innovations Association FRUCT April 2019 Article No.: 77, Pp. 556564.
5. William Fleshman. Spectral clustering (Foundation and Application) https://towardsdatascience.com/spectral-clustering-aba2640c0d5b