编辑:下面是如何实现矩阵乘法的问题。免责声明:对于一个非常大的语料库来说,这可能是不可行的。
sklearn公司:
from sklearn.feature_extraction.text import CountVectorizer
Doc1 = 'Wimbledon is one of the four Grand Slam tennis tournaments, the others being the Australian Open, the French Open and the US Open.'
Doc2 = 'Since the Australian Open shifted to hardcourt in 1988, Wimbledon is the only major still played on grass'
docs = [Doc1, Doc2]
# Instantiate CountVectorizer and apply it to docs
cv = CountVectorizer()
doc_cv = cv.fit_transform(docs)
# Display tokens
cv.get_feature_names()
# Display tokens (dict keys) and their numerical encoding (dict values)
cv.vocabulary_
# Matrix multiplication of the term matrix
token_mat = doc_cv.toarray().T @ doc_cv.toarray()
根西姆:
import gensim as gs
import numpy as np
cp = [[(0, 2),
(1, 1),
(2, 1),
(3, 1),
(4, 11),
(7, 1),
(11, 2),
(13, 3),
(22, 1),
(26, 1),
(30, 1)],
[(4, 31),
(8, 2),
(13, 2),
(16, 2),
(17, 2),
(26, 1),
(28, 4),
(29, 1),
(30, 1)]]
# Convert to a dense matrix and perform the matrix multiplication
mat_1 = gs.matutils.sparse2full(cp[0], max(cp[0])[0]+1).reshape(1, -1)
mat_2 = gs.matutils.sparse2full(cp[1], max(cp[0])[0]+1).reshape(1, -1)
mat = np.append(mat_1, mat_2, axis=0)
mat_product = mat.T @ mat
对于连续出现的单词,可以为一组文档准备一个bigram列表,然后使用python的计数器计算bigram的出现次数。下面是一个使用nltk的示例。
import nltk
from nltk.util import ngrams
from nltk.stem import WordNetLemmatizer
from nltk.corpus import stopwords
from collections import Counter
stop_words = set(stopwords.words('english'))
# Get the tokens from the built-in collection of presidential inaugural speeches
tokens = nltk.corpus.inaugural.words()
# Futher text preprocessing
tokens = [t.lower() for t in tokens if t not in stop_words]
word_l = WordNetLemmatizer()
tokens = [word_l.lemmatize(t) for t in tokens if t.isalpha()]
# Create bigram list and count bigrams
bi_grams = list(ngrams(tokens, 2))
counter = Counter(bi_grams)
# Show the most common bigrams
counter.most_common(5)
Out[36]:
[(('united', 'state'), 153),
(('fellow', 'citizen'), 116),
(('let', 'u'), 99),
(('i', 'shall'), 96),
(('american', 'people'), 40)]
# Query the occurrence of a specific bigram
counter[('great', 'people')]
Out[37]: 7