我正在尝试从同一组10,000个文档中获取10,000个文档列表的相关文档。我使用两种算法进行测试:gensim lsi和gensim相似度。两者都给出了可怕的结果。我该如何改进呢?
from gensim import corpora, models, similarities
from nltk.corpus import stopwords
import re
def cleanword(word):
return re.sub(r'\W+', '', word).strip()
def create_corpus(documents):
# remove common words and tokenize
stoplist = stopwords.words('english')
stoplist.append('')
texts = [[cleanword(word) for word in document.lower().split() if cleanword(word) not in stoplist]
for document in documents]
# remove words that appear only once
all_tokens = sum(texts, [])
tokens_once = set(word for word in set(all_tokens) if all_tokens.count(word) == 1)
texts = [[word for word in text if word not in tokens_once] for text in texts]
dictionary = corpora.Dictionary(texts)
corp = [dictionary.doc2bow(text) for text in texts]
def create_lsi(documents):
corp = create_corpus(documents)
# extract 400 LSI topics; use the default one-pass algorithm
lsi = models.lsimodel.LsiModel(corpus=corp, id2word=dictionary, num_topics=400)
# print the most contributing words (both positively and negatively) for each of the first ten topics
lsi.print_topics(10)
def create_sim_index(documents):
corp = create_corpus(documents)
index = similarities.Similarity('/tmp/tst', corp, num_features=12)
return index
答案 0 :(得分:3)
您好像根本没有使用create_lsi()
?您只需打印创建的LSI模型,然后忘记它。
12
中的num_features=12
号来自何处?对于BOW向量,它应该是num_features=len(dictionary)
,对于LSI向量,它应该是num_features=lsi.num_topics
。
在LSI之前添加TF-IDF转换。
查看http://radimrehurek.com/gensim/tutorial.html处的gensim教程,它会更详细地介绍这些步骤。评论。
答案 1 :(得分:0)
LSI用于大量文本数据。我们可以使用奇异值分解在缩小的空间中形成具有相关项的矩阵。在gensim包中,您可以通过仅返回前n个术语来获得顶级语义相似的术语。
lsimodel.print_topic(10,topn = 5) 其中10是主题数,5是每个主题的前5个术语。
因此,您可以减少不相关的条款。
答案 2 :(得分:-1)
您需要使用其他机器学习算法,例如:具有余弦相似性的聚类(k-means)