Hướng dẫn cluster sentences by similarity python - cụm câu bởi tương tự python

Những bài báo khoa học dữ liệu nào có được sự hấp dẫn hơn từ độc giả (Phần 2)

Ảnh của Hanson Lu trên unplash

Trong loạt bài viết này, chúng tôi đang phân tích tài liệu lưu trữ lịch sử của các ấn phẩm khoa học dữ liệu để hiểu những chủ đề nào phổ biến hơn với độc giả. Trước đây chúng tôi đề cập đến cách lấy dữ liệu sẽ được sử dụng để phân tích thêm.

Chúng tôi sẽ đề cập đến cách làm sạch dữ liệu văn bản mà chúng tôi đã thu thập trước đó, nhóm các chủ đề tương tự bằng cách sử dụng các biểu đồ mạng và thiết lập các mẫu trong các cụm này trong bài viết này.

Tóm tắt dữ liệu

Hãy để nhắc nhở bản thân chúng ta như thế nào các dữ liệu trông như thế nào. Đó là sự kết hợp của các bài viết thu được từ ba nguồn dữ liệu [Trường: ‘Nguồn] - Phân tích Vidhya [‘ AVD], TDS [‘TDS,] và hướng tới AI [‘ Tai,].

Chúng tôi đã thu thập các tiêu đề, phụ đề, vỗ tay và phản hồi từ các bài viết riêng lẻ trong tài liệu lưu trữ của các ấn phẩm.

import pandas as pd# Reading the data obtained using code here.
avd = pd.read_csv('analytics_vidhya_data.csv')
tds = pd.read_csv('medium_articles.csv')
tai = pd.read_csv('towards_ai_data.csv')
avd['source'] = 'avd'
tds['source'] = 'tds'
tai['source'] = 'tai'
# Create single data set, join title and subtitle
single_matrix = pd.concat([avd, tds, tai])
single_matrix['title_subtitle'] = [' '.join([str(i),str(j)]) for i, j in zip(single_matrix['Title'].fillna(''), single_matrix['Subtitle'].fillna(''))]
Articles tập dữ liệu

Chúng tôi đã thêm một cột bổ sung trong bộ dữ liệu có tên ‘Title_SubTitle, đó là sự tham gia của các cột‘ Tiêu đề và SUBTITLE, chúng tôi sẽ chủ yếu sử dụng cột này để có cái nhìn tốt hơn về chủ đề mà bài viết thuộc về. Khá thú vị 39% các bài báo không có phụ đề và tỷ lệ rất nhỏ (0,13%) don lồng có tiêu đề.

Hãy để nhanh chóng nhìn vào các phân phối và phản hồi cho mọi nguồn dữ liệu. Chúng tôi bắt đầu với các lô hộp, chúng tôi sử dụng thư viện Seaborn trong Python để tạo ra âm mưu của chúng tôi.

# We will use seaborn to create all plots
import seaborn as sns
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(8, 5))
# Claps
sns.boxplot(ax=axes[0], x="source", y="Claps", data=single_matrix)
# Responses
sns.boxplot(ax=axes[1], x="source", y="Responses", data=single_matrix)

Chúng ta có thể thấy rằng đối với khoa học dữ liệu không chỉ có nhiều hoạt động hơn, mà còn khá nhiều ngoại lệ với các bài báo riêng lẻ đạt được rất nhiều sức hấp dẫn từ độc giả. Tất nhiên, hoạt động cho mỗi nguồn phụ thuộc vào quy mô xuất bản, đối với các ấn phẩm lớn hơn mà chúng tôi quan sát nhiều nhà văn và độc giả.

Khi nói đến các phản ứng, chúng tôi quan sát thấy ít hoạt động hơn so với vỗ tay trên tất cả các nguồn, mặc dù hành vi đó không phải là rất bất ngờ.

Các ô hộp cho vỗ tay và phản hồi được chia theo nguồn

Tiếp theo, chúng tôi loại bỏ các ngoại lệ và trực quan hóa các phân phối của các trường để có một bức tranh rõ ràng hơn.

# Code to create distribution subplots
fig, axes = plt.subplots(2, 1, figsize=(8, 8))
# Claps
sns.distplot(avd['Claps'][avd['Claps']<10000], hist=True, rug=False, ax=axes[0])
sns.distplot(tds['Claps'][tds['Claps']<10000], hist=True, rug=False, ax=axes[0])
sns.distplot(tai['Claps'][tai['Claps']<10000], hist=True, rug=False, ax=axes[0])
# Responses
sns.distplot(avd['Responses'], hist=True, rug=False, ax=axes[1])
sns.distplot(tds['Responses'], hist=True, rug=False, ax=axes[1])
sns.distplot(tai['Responses'], hist=True, rug=False, ax=axes[1])

Chúng ta có thể thấy rằng cả hai phân phối đều bị sai lệch ở bên trái, có nghĩa là nhiều bài viết nhất nhận được rất ít vỗ tay và thậm chí ít phản hồi hơn. Tuy nhiên, một lần nữa điều này không đáng ngạc nhiên, vì sự thành công của các bài báo phụ thuộc vào nhiều yếu tố, chẳng hạn như viết chất lượng tốt, các chủ đề liên quan và nhiều hơn nữa. Nổi bật một sự cân bằng tốt không phải là một nhiệm vụ đơn giản!

Phân phối và phản hồi phân phối được chia theo nguồn

Làm thế nào để làm sạch dữ liệu văn bản?

Dữ liệu làm sạch là một bước quan trọng (nếu không phải là phần quan trọng nhất) khi làm việc với văn bản. Có những thực tiễn tiêu chuẩn mà người ta tuân theo khi xử lý các nhiệm vụ như vậy. Chúng tôi sẽ thực hiện các bước sau để xử lý các tiêu đề và phụ đề:

  • loại bỏ dấu chấm câu và các biểu tượng khác
  • Xóa các từ và chữ số dừng
  • từ ngữ

Chúng tôi sẽ sử dụng hỗn hợp các biểu thức thông thường và thư viện NLTK để xóa dấu chấm câu, ký hiệu, dừng từ và chữ số. remove punctuation marks, symbols, stop words and digits.

import re
single_matrix['title_subtitle'] = [re.findall(r'\w+', i.lower()) for i in single_matrix['title_subtitle'].fillna('NONE')]

Mã trên phù hợp với một hoặc nhiều ký tự từ, trên thực tế là r triệt \ w+ Ngoài ra, khi áp dụng các lệnh re.findall () và i.lower (), chúng chia một cách thuận tiện các câu thành các từ và biến chúng thành chữ thường. Điều này sẽ rất hữu ích trong các bước tiếp theo. Vì vậy, câu ‘Báo cáo trong Qlikview | Báo cáo ad hoc trở thành [Báo cáo, trong, Qlikview, AD, HOC, Báo cáo].

Tiếp theo, chúng tôi sẽ sử dụng thư viện NLTK để tải lên từ điển các từ dừng để chúng tôi có thể xóa chúng khỏi các câu. Ngoài ra, chúng tôi nối các từ ‘sử dụng và‘ phần ‘vào danh sách, vì chúng được sử dụng quá mức trong tập dữ liệu. Để loại bỏ các từ dừng chúng tôi sử dụng cho vòng lặp để lặp qua từng câu, khi làm như vậy, chúng tôi cũng đảm bảo xóa các chữ số khỏi các câu.

# The code to upload list of stop words and remove them from sentencesimport nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
stopwords_eng = stopwords.words('english')
stopwords_eng += ['use', 'using', 'used', 'part']
new_titles_sub = []
for title_sub in single_matrix['new_title_subtitle']:
new_title_sub = []
for w_title in title_sub:
if w_title not in stopwords_eng and not w_title.isdigit():
new_title_sub.append(w_title)

new_titles_sub.append(new_title_sub)

single_matrix['new_title_subtitle'] = new_titles_sub

Cuối cùng, chúng ta sẽ làm cho các từ trong các câu. Lemmatisation biến đổi từ này thành hình thức gốc có ý nghĩa của nó đang xem xét bối cảnh. Thường xuất phát được sử dụng như một sự thay thế nhanh hơn về mặt tính toán, tuy nhiên ít chính xác hơn. Một lần nữa, chúng tôi sử dụng NLTK để làm cho các từ

nltk.download('wordnet')
nltk.download('words')
from nltk.stem import WordNetLemmatizer
wordnet_lemmatizer = WordNetLemmatizer()
new_titles_sub = []
for title_sub in single_matrix['title_subtitle']:
new_title_sub = []
for w_title in title_sub:
new_title_sub.append(wordnet_lemmatizer.lemmatize(w_title, pos="v"))
new_titles_sub.append(new_title_sub)

single_matrix['new_title_subtitle'] = new_titles_sub
single_matrix['new_title_subtitle'] = [' '.join(i) for i in single_matrix['new_title_subtitle']]

Hãy cùng xem các câu trông như thế nào sau khi tất cả các biến đổi

Làm thế nào để vector hóa dữ liệu văn bản bằng TF-IDF?

TF-IDF là viết tắt của tần số tài liệu-nghịch đảo tần số và đó là thước đo số lượng từ khóa có liên quan đến một tài liệu trong một số bộ tài liệu cụ thể. Nó thường được sử dụng trong phân tích văn bản, một số ví dụ bao gồm xếp hạng nội dung và truy xuất thông tin. Đây là một bài báo khá hữu ích nói về cách tiếp cận chi tiết hơn.

Như một tên cho thấy biện pháp này bao gồm hai phần, một phần tìm thấy tần số của một từ xuất hiện trong một tài liệu (TF) và một phần khác là mức độ duy nhất từ ​​trong một kho văn bản (IDF). Hãy cùng xem phiên bản đơn giản hóa công thức và các thành phần của nó:

Chúng ta có thể thấy rằng các từ xuất hiện thường xuyên hơn sẽ dẫn đến điểm TF-IDF thấp hơn và đối với các từ hiếm, điểm số sẽ cao hơn. Điều chỉnh trọng lượng này là khá quan trọng, vì các từ được sử dụng quá mức sẽ không có ý nghĩa bổ sung.

Cách dễ nhất để hiểu các tính toán là ví dụ, trong bộ dữ liệu của chúng tôi, một tiêu đề duy nhất là một tài liệu và tất cả các tiêu đề tạo thành một kho văn bản (bộ tài liệu). Hãy xem xét từ ‘tạo ra trong tiêu đề‘ Sử dụng các biến QlikView Tạo các câu chuyện dữ liệu mạnh mẽ, tài liệu có 7 từ và ‘tạo ra chỉ xuất hiện một lần, do đó tf (tạo) = 1/7. Tổng số bài viết trong một trong các nguồn dữ liệu là 12963 và từ ‘tạo ra xuất hiện trong 268 tiêu đề để idf (created) = log (12963/268) = 3,88. Do đó, TF-IDF = 0,14*3,88 = 0,55 là điểm cho từ ‘tạo ra.

Bây giờ chúng ta biết cách tính điểm cho từng từ trong một tài liệu, chúng ta có thể cung cấp cho tập dữ liệu với tiêu đề và phụ đề của bài viết. Đối với điều này, chúng tôi sẽ sử dụng Thư viện Sklearn trong Python, đặc biệt là chức năng TfidFvectorizer.

Lưu ý: TfidFvectorizer sử dụng một công thức hơi khác so với quy định ở trên, nó thêm 1 vào IDF. Điều này được thực hiện để đảm bảo rằng các từ xuất hiện trong mọi tài liệu không bị bỏ qua.

from sklearn.feature_extraction.text import TfidfVectorizertf = TfidfVectorizer(analyzer='word', ngram_range=(1, 3), min_df=0)tfidf_matrices = []
data_sets = []
for source in ['avd', 'tai', 'tds']:
source_data = single_matrix[single_matrix['source'] == source].drop_duplicates()
data_sets.append(source_data['new_title_subtitle'])
tfidf_matrices.append(tf.fit_transform(
source_data['new_title_subtitle']))

Chúng tôi đã giới thiệu vòng lặp For mà lặp lại thông qua các nguồn dữ liệu, điều này được thực hiện để cải thiện thời gian tính toán. Điều này cũng sẽ cần thiết khi nhìn vào khoảng cách giữa tất cả các cặp câu và phân vùng chúng thành các nhóm. Đầu ra là ma trận thưa thớt, trong đó các hàng là tài liệu và cột tất cả các từ duy nhất trong một kho văn bản.

Bây giờ chúng tôi đã có các tiêu đề và phụ đề vector hóa, chúng tôi có thể tính toán khoảng cách theo cặp giữa tất cả các câu. Chúng tôi sẽ sử dụng sự tương đồng về cosine giữa các cặp vectơ đại diện cho các câu. Biện pháp xem xét góc giữa hai vectơ và thường được sử dụng trong phân tích văn bản. Một số giải thích tốt về biện pháp tương tự được chọn có thể được tìm thấy ở đây, bài viết không chỉ cung cấp định nghĩa rõ ràng mà còn thảo luận về việc sử dụng dựa trên bối cảnh.calculate pairwise distances between all the sentences. We will use cosine similarity between pairs of vectors that represent sentences. The measure considers the angle between two vectors and commonly used in text analysis. Some good explanations of the chosen similarity measure can be found here, the paper not only provides clear definition it also discusses context based uses.

Chúng tôi đã sử dụng thư viện Sklearn để tính toán các điểm tương đồng cosine theo cặp, nhưng một lần nữa chia tách theo nguồn.

from sklearn.metrics.pairwise import linear_kernel
matrix_with_cos_sim = []
for m in tfidf_matrices:
matrix_with_cos_sim.append(linear_kernel(m, m))

Đầu ra cho mỗi nguồn dữ liệu là một mảng numpy (NXN) với sự tương đồng theo cặp giữa tất cả các câu trong đó n là số lượng tiêu đề/phụ đề cho một nguồn dữ liệu duy nhất.

Làm thế nào để nhóm các câu tương tự bằng biểu đồ mạng?

Mục đích của chúng tôi là tìm các cụm có các bài viết bao gồm các chủ đề khoa học dữ liệu tương tự, để đạt được điều này, chúng tôi sẽ bắt đầu bằng cách xây dựng một biểu đồ có trọng số trong đó các nút là bài viết và các cạnh là sự tương đồng về cosine của chúng. Sau đó, chúng tôi có thể tạo các cụm bằng cách áp dụng phân vùng đồ thị với mục tiêu để tìm các sơ đồ con có ý nghĩa (còn gọi là cộng đồng) mà không áp đặt một số cộng đồng.

Chúng tôi sẽ sử dụng các thư viện Python NetworkX và cộng đồng để xây dựng và phân vùng biểu đồ. Trước khi chúng tôi tiến hành xây dựng biểu đồ, chúng tôi sẽ chỉ chọn 15 tựa game tương tự cho mỗi tài liệu trong một kho, số được chọn dựa trên biện pháp gọi là mô -đun cho chỉ dẫn phân vùng tốt như thế nào. Cách tiếp cận này không chỉ làm sắc nét đồ thị mà còn giúp với tốc độ tính toán.

import numpy as np
from tqdm import tnrange
top_n_sentences = []
for cs, t in zip(matrix_with_cos_sim, data_sets):
no_dups = np.array(t)
i = 0
top_frame = []
for c, z in zip(cs, tnrange(len(cs))):
# Create vector of titles
start_name = pd.Series([no_dups[i]]*15)
# Index of top 15 similar titles
ix_top_n = np.argsort(-c)[0:15]
cos_sim = pd.Series(c[ix_top_n])
names = pd.Series(no_dups[ix_top_n])
i +=1
top_frame.append(pd.DataFrame([start_name, names, cos_sim]).transpose())

top_frame = pd.concat(top_frame)
top_frame.columns = ['title1', 'title2', 'cos_sim']
# Remove the similarities for the same sentences
top_frame['is_same'] = [bool(i==j) for i, j in zip(top_frame['title1'], top_frame['title2'])]
top_frame = top_frame[top_frame['is_same'] != True]

top_n_sentences.append(top_frame)

Tập lệnh tạo ra khung dữ liệu với 15 tiêu đề tương tự hàng đầu cho mỗi tiêu đề trong tập dữ liệu (chia theo nguồn), nó sẽ được sử dụng làm đầu vào để xây dựng biểu đồ. Hãy xem xét ví dụ về khung dữ liệu cho một trong các nguồn

Chúng tôi sẽ tiếp tục bằng cách xây dựng và phân vùng biểu đồ, chúng tôi sẽ làm điều đó cho nguồn có số lượng bài viết lớn thứ hai là phân tích Vidhya. Các đoạn mã có thể được áp dụng cho tất cả các nguồn được đề cập trong bài viết này.

# We start by defining the structure of the graphtop_frame = top_n_sentences[2] #TDS articlesedges = list(zip(top_frame['title1'], top_frame['title2']))
weighted_edges = list(zip(top_frame['title1'], top_frame['title2'], top_frame['cos_sim']))
nodes = list(set(top_frame['title1']).union(set(top_frame['title2'])))

Bây giờ chúng ta có thể sử dụng NetworkX để xây dựng biểu đồ bằng cấu trúc được xác định ở trên

# We will use seaborn to create all plots
import seaborn as sns
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(8, 5))
# Claps
sns.boxplot(ax=axes[0], x="source", y="Claps", data=single_matrix)
# Responses
sns.boxplot(ax=axes[1], x="source", y="Responses", data=single_matrix)
0

Tiếp theo, chúng tôi phân vùng biểu đồ bằng thư viện cộng đồng, trước khi nhập mô-đun đảm bảo cài đặt thư viện Python-Louvain để tránh lỗi.

# We will use seaborn to create all plots
import seaborn as sns
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(8, 5))
# Claps
sns.boxplot(ax=axes[0], x="source", y="Claps", data=single_matrix)
# Responses
sns.boxplot(ax=axes[1], x="source", y="Responses", data=single_matrix)
1

Trước đó chúng tôi đã đề cập đến mô -đun, biện pháp phân vùng tốt như thế nào, giá trị trong trường hợp này là 0,7. Thông thường, các giá trị trên 0,6 được coi là đủ phân vùng.

# We will use seaborn to create all plots
import seaborn as sns
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(8, 5))
# Claps
sns.boxplot(ax=axes[0], x="source", y="Claps", data=single_matrix)
# Responses
sns.boxplot(ax=axes[1], x="source", y="Responses", data=single_matrix)
2

Mã trên tạo ra biểu đồ và cộng đồng mà chúng tôi vừa tìm thấy, mặc dù cốt truyện trông khá bận rộn, chúng tôi vẫn có thể thấy khá nhiều cụm được tìm thấy bởi phương pháp này.

Tiêu đề và phụ đề được phân chia thành cộng đồng

Trước khi chúng ta xem xét các cụm chi tiết hơn, chúng ta sẽ chuyển đổi các biến phân vùng mà chúng ta đã tạo trước đó thành một định dạng dễ đọc hơn.

# We will use seaborn to create all plots
import seaborn as sns
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(8, 5))
# Claps
sns.boxplot(ax=axes[0], x="source", y="Claps", data=single_matrix)
# Responses
sns.boxplot(ax=axes[1], x="source", y="Responses", data=single_matrix)
3

Đầu ra của mã trên là khung dữ liệu với tất cả các tiêu đề và phụ đề và cộng đồng mà chúng thuộc về 45 cụm được xác định bằng cách phân vùng biểu đồ.

Tiêu đề và phụ đề được phân chia thành cộng đồng

Bây giờ chúng tôi đã thu được các cụm, chúng tôi có thể tạo số liệu thống kê tóm tắt cho từng loại để hiểu nếu bất kỳ trong số chúng có nhiều hoạt động hơn. Chúng tôi sẽ hợp nhất tập dữ liệu có phân vùng với tập dữ liệu có tiếng vỗ tay và phản hồi sau đó chúng tôi sẽ tính toán tối thiểu, tối đa, trung bình, trung bình và số lượng bài viết cho mỗi nhóm. Mặc dù chủ yếu sẽ tập trung vào trung bình, vì chúng tôi đã thấy trước đó rằng dữ liệu bị sai lệch đối với các giá trị nhỏ hơn và có các ngoại lệ.

# We will use seaborn to create all plots
import seaborn as sns
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(8, 5))
# Claps
sns.boxplot(ax=axes[0], x="source", y="Claps", data=single_matrix)
# Responses
sns.boxplot(ax=axes[1], x="source", y="Responses", data=single_matrix)
4

Đối với mục đích đại diện sẽ chỉ xem xét ba cộng đồng có hoạt động của người đọc thấp nhất và ba cộng đồng cao nhất. Trước tiên chúng tôi xem xét tập dữ liệu và sau đó chúng tôi sẽ trực quan hóa đám mây Word để xác định chủ đề chung trong mỗi nhóm.

Cộng đồng hoạt động độc giả thấp nhất và cao nhất

Bảng trên cho thấy rằng các nhóm không lớn lắm, hãy để xem các chủ đề phổ biến trong mỗi cụm chúng ta sẽ sử dụng thư viện WordCloud cho việc này là gì.

# We will use seaborn to create all plots
import seaborn as sns
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(8, 5))
# Claps
sns.boxplot(ax=axes[0], x="source", y="Claps", data=single_matrix)
# Responses
sns.boxplot(ax=axes[1], x="source", y="Responses", data=single_matrix)
5

Trước tiên chúng tôi nhìn vào các cộng đồng có hoạt động thấp nhất, có vẻ như cụm 19 chủ yếu có các bài viết thuộc về một tác giả sẽ giải thích hoạt động thấp hơn. Hai cụm khác bao gồm nhiều bài viết được viết bởi nhiều tác giả. Khá thú vị, chúng ta có thể quan sát rằng các chủ đề như lập trình hướng đối tượng trong Python, và ‘Phát hiện gian lận đã thu hút ít sự quan tâm nhất từ ​​độc giả.

Các cụm có hoạt động của người đọc thấp hơn

Chuyển sang các cụm có hoạt động cao nhất, các chủ đề nổi bật gây ra sự quan tâm nhiều hơn từ độc giả là xử lý ngôn ngữ tự nhiên, mạng lưới thần kinh, chức năng kích hoạt và hỗ trợ máy vector.

Các cụm có hoạt động của người đọc cao hơn

Gói (lại

Mặc dù chúng tôi có thể thiết lập các chủ đề phổ biến trong các nhóm hoạt động của độc giả thấp và cao, nhưng chúng tôi vẫn quan sát thấy các bài viết không có nhiều vỗ tay và phản hồi cũng như các bài có hoạt động cao trong mỗi nhóm. Phân tích có thể có ích khi cố gắng thiết lập các mô hình chung về những gì độc giả quan tâm, cũng như các chủ đề có độ bão hòa cao hơn của các bài báo. Tuy nhiên, việc chọn một chủ đề có liên quan không đảm bảo thành công của bài viết, vì nhiều yếu tố quan trọng khác đóng góp vào việc thu hút được từ người đọc.

Làm thế nào để bạn phân cụm các câu tương tự trong Python?

Bạn có thể sử dụng thuật toán phân cụm dựa trên FAISS nếu số lượng câu được phân cụm bằng hàng triệu hoặc nhiều hơn vì các phương tiện Vanilla K như thuật toán phân cụm mất thời gian bậc hai ...
Nó gây trở ngại cho tôi tại sao rất nhiều người cố gắng sử dụng bert nhúng cho sự tương đồng về ngữ nghĩa. ....
Này @jamix. ....
Thanks!.

Làm thế nào để bạn tìm thấy sự tương đồng giữa hai câu trong Python?

Sự tương tự cosine là thước đo sự tương đồng giữa hai vectơ khác không của không gian sản phẩm bên trong đo cosin của góc giữa chúng. Sự tương đồng = (A.B) / (|| a ||. || b ||) trong đó a và b là vectơ.Similarity = (A.B) / (||A||. ||B||) where A and B are vectors.

Làm thế nào để bạn phân cụm văn bản trong Python?

Methodology..
Nhập bộ dữ liệu ..
Áp dụng tiền xử lý cho kho văn bản của chúng tôi để xóa các từ và ký hiệu, khi được chuyển đổi thành định dạng số, không thêm giá trị cho mô hình của chúng tôi ..
Sử dụng TF-idf làm thuật toán vector hóa ..
Áp dụng kmeans để nhóm dữ liệu của chúng tôi ..

Bert có thể được sử dụng để phân cụm không?

Ở đây chúng tôi sẽ sử dụng Bert để xác định sự tương đồng giữa các câu và sau đó chúng tôi sẽ sử dụng phương pháp phân cụm KMeans để phân cụm các câu với cùng một bối cảnh lại với nhau.use BERT to identify the similarity between sentences and then we will use the Kmeans clustering approach to cluster the sentences with the same context together.