Nlp 低效的标记化导致更好的结果

Nlp 低效的标记化导致更好的结果,nlp,tokenize,gensim,Nlp,Tokenize,Gensim,我正在遵循来自的代码 我有一个包含8000个问题和答案的csv文件,我使用gensim从tfidf语料库中创建了一个包含1000个主题的LSI模型,如下所示。我只把问题当作课文的一部分,而不是答案。 texts = [jieba.lcut(text) for text in document] # tk = WhitespaceTokenizer() # texts = [tk.tokenize(text) for text in document] dictionary = corpora.

我正在遵循来自的代码

我有一个包含8000个问题和答案的csv文件,我使用gensim从tfidf语料库中创建了一个包含1000个主题的LSI模型,如下所示。我只把问题当作课文的一部分,而不是答案。
texts = [jieba.lcut(text) for text in document]
# tk = WhitespaceTokenizer() 
# texts = [tk.tokenize(text) for text in document]
dictionary = corpora.Dictionary(texts)
feature_cnt = len(dictionary.token2id)
corpus = [dictionary.doc2bow(text) for text in texts]
tfidf = models.TfidfModel(corpus)
tfidf_corpus = tfidf[corpus]
lsi_model = models.LsiModel(tfidf_corpus, id2word=dictionary, num_topics=1000)
corpus_lsi = lsi_model[tfidf_corpus]
index = similarities.SparseMatrixSimilarity(corpus_lsi, num_features = feature_cnt)
在此之前,我还通过使用nltk删除停止字和使用正则表达式替换标点,以及使用wordnet和nltk对数据进行预处理

我知道jieba不是一个适合英语的标记器,因为它标记空格,就像这样:

Sample: This is untokenized text
Tokenized: 'This',' ','is',' ','untokenized', ' ', 'text'
当我从jieba切换到nltk空白标记器时,奇怪的事情发生了,我的准确率突然下降,即当我使用以下代码生成一个新句子时,我得到了更糟糕的结果

keyword = "New sentence the similarity of which is to be found to the main corpus"
kw_vector = dictionary.doc2bow(jieba.lcut(keyword)) # jieba.lcut can be replaced by tk.tokenize()
sim = index[lsi_model[tfidf[kw_vector]]]                         
x = [sim[i] for i in np.argsort(sim)[-2:]]
我的理解是多余和无用的单词和字符(如空格)会降低准确性,但在这里我观察到了相反的效果。可能的原因是什么

我提出的一个可能的解释是,大多数问题都很简短,只有5到6个单词,比如

  • 办公室地址是什么
  • X的联系人是谁
  • 在哪里可以找到文件Y

  • 有许多标记化方案,包括n-chars。不同的代币制造者对代币的构成有不同的看法。没有最好的标记器。一些标记化器对某些任务更有效,而其他标记化器对其他任务更有效。根据我有限的理解,我认为对于文本NLP任务,最好减少对文档没有任何价值的单词/字符。基于此,我认为添加空格也会给模型添加不必要的信息,这一点都没有帮助。你的想法@SergeyBushmanov?让我们做一个思想实验。让我们试着将两个句子“经过长时间考虑,我认为我的答案是否定的”和“不”分为两类:“深思熟虑的”和“不深思熟虑的”。你认为空格的数量有帮助吗?还有,下游的“准确度”评估显示了差异?(这是一个严格的可重复评分,还是仅仅是你对结果是否满意的特别人工观察?)?(如果它仍然优于NLTK标记化,那么可能是标记化中的其他差异,或者它与其他预处理的交互,才是最重要的。)