Семантическая кластеризация на основе WordNet в Python - PullRequest
0 голосов
/ 05 декабря 2018

Я беру pdf корпус и создаю список токенов.Из этих токенов я беру 10 наиболее распространенных слов для создания их кластеров, и исходя из их семантики, мне нужно составить полный список токенов на основе их соответствующих значений.Я могу сгенерировать кластер, но хочу построить векторы списка токенов на диаграмме рассеяния на основе их соответствующей леммы.Например,в моем кластере, если у слова «время» есть кластер, тогда слово разделяет ту же лемму со словом «год», которое присутствует в списке токенов, но отсутствует в списке 10 наиболее распространенных слов.Как мы можем кластеризовать токены на основе набора синонимов?Вот мой прогресс в том, что кластеры могут строить:

import string
import re
import nltk
import PyPDF4
import numpy
from collections import Counter
from sklearn.cluster import KMeans
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import PCA
from nltk.corpus import wordnet
import matplotlib.pyplot as plt
import matplotlib.cm as cm


# Declaring all the variables
stopwords = nltk.corpus.stopwords.words('english')
# additional stopwords to be removed manually.
file = open('Corpus.txt', 'r')
moreStopwords = file.read().splitlines()
ps = nltk.PorterStemmer()
wn = nltk.WordNetLemmatizer()

data = PyPDF4.PdfFileReader(open('ReadyPlayerOne.pdf', 'rb'))
pageData = ''
for page in data.pages:
    pageData += page.extractText()


def clean_text(text):
    text = "".join([word.lower() for word in text if word not in string.punctuation])
    tokenize = re.split("\W+", text)
    text = [wn.lemmatize(word) for word in tokenize if word not in stopwords]
    final = [word for word in text if word not in moreStopwords]
    # Accessing wordnet synset corpora to find the meaning of the words.
    # lemmas = []
    # for token in text:
    #     lemmas += [synset.lemmas()[0].name() for synset in wordnet.synsets(token)]
    # # return list(set(lemmas)) # returns unique words
    # return list(lemmas)
    return final


filter_data = clean_text(pageData)
# get most common words & plot them on bar graph
most_common_words = [word for word, word_count in Counter(filter_data).most_common(10)]
word_freq = [word_count for word, word_count in Counter(filter_data).most_common(10)]
# Vectorizing most common words & filter data
mcw_vec = TfidfVectorizer()
fd_vec = TfidfVectorizer()
tfidf_mcw = mcw_vec.fit_transform(most_common_words)
tfidf_fd = fd_vec.fit_transform(filter_data)
# print(mcw_vec.get_feature_names())

# Create cluster
cluster = KMeans(n_clusters=len(most_common_words), max_iter=300, precompute_distances='auto', n_jobs=-1)
X = cluster.fit_transform(tfidf_mcw)
pca = PCA(n_components=2).fit(X)
data2D = pca.transform(X)
plt.scatter(data2D[:, 0], data2D[:, 0], c=numpy.random.random(len(most_common_words)))
plt.show()

filter_data - мой список всех токенов из pdf-источника.А Most_common_words - это список наиболее распространенных слов, которые я использую для создания 10 кластеров.Мне разрешено исключать слова, если они не подпадают под семантическую группу из этих 10 слов.Я векторизовал все, что мне нужно, это кластеризовать данные фильтра на основе synset.lemmas ().

...