2017-06-22 603 views
0

我正在Python中使用它的gensim包使用Doc2Vec技術構建NLP聊天應用程序。我已經完成了詞幹化和詞幹化。我想從訓練集以及用戶拋出的問題中刪除停用詞(以測試它是否更好)。如何從gensim中的文檔中刪除停用詞?

這是我的代碼。

import gensim 
import nltk 
from gensim import models 
from gensim import utils 
from gensim import corpora 
from nltk.stem import PorterStemmer 
ps = PorterStemmer() 

sentence0 = models.doc2vec.LabeledSentence(words=[u'sampl',u'what',u'is'],tags=["SENT_0"]) 
sentence1 = models.doc2vec.LabeledSentence(words=[u'sampl',u'tell',u'me',u'about'],tags=["SENT_1"]) 
sentence2 = models.doc2vec.LabeledSentence(words=[u'elig',u'what',u'is',u'my'],tags=["SENT_2"]) 
sentence3 = models.doc2vec.LabeledSentence(words=[u'limit', u'what',u'is',u'my'],tags=["SENT_3"]) 
sentence4 = models.doc2vec.LabeledSentence(words=[u'claim',u'how',u'much',u'can',u'I'],tags=["SENT_4"]) 
sentence5 = models.doc2vec.LabeledSentence(words=[u'retir',u'i',u'am',u'how',u'much',u'can',u'elig',u'claim'],tags=["SENT_5"]) 
sentence6 = models.doc2vec.LabeledSentence(words=[u'resign',u'i',u'have',u'how',u'much',u'can',u'i',u'claim',u'elig'],tags=["SENT_6"]) 
sentence7 = models.doc2vec.LabeledSentence(words=[u'promot',u'what',u'is',u'my',u'elig',u'post',u'my'],tags=["SENT_7"]) 
sentence8 = models.doc2vec.LabeledSentence(words=[u'claim',u'can,',u'i',u'for'],tags=["SENT_8"]) 
sentence9 = models.doc2vec.LabeledSentence(words=[u'product',u'coverag',u'cover',u'what',u'all',u'are'],tags=["SENT_9"]) 
sentence10 = models.doc2vec.LabeledSentence(words=[u'hotel',u'coverag',u'cover',u'what',u'all',u'are'],tags=["SENT_10"]) 
sentence11 = models.doc2vec.LabeledSentence(words=[u'onlin',u'product',u'can',u'i',u'for',u'bought',u'through',u'claim',u'sampl'],tags=["SENT_11"]) 
sentence12 = models.doc2vec.LabeledSentence(words=[u'reimburs',u'guidelin',u'where',u'do',u'i',u'apply',u'form',u'sampl'],tags=["SENT_12"]) 
sentence13 = models.doc2vec.LabeledSentence(words=[u'reimburs',u'procedur',u'rule',u'and',u'regul',u'what',u'is',u'the',u'for'],tags=["SENT_13"]) 
sentence14 = models.doc2vec.LabeledSentence(words=[u'can',u'i',u'submit',u'expenditur',u'on',u'behalf',u'of',u'my',u'friend',u'and',u'famili',u'claim',u'and',u'reimburs'],tags=["SENT_14"]) 
sentence15 = models.doc2vec.LabeledSentence(words=[u'invoic',u'bills',u'procedur',u'can',u'i',u'submit',u'from',u'shopper stop',u'claim'],tags=["SENT_15"]) 
sentence16 = models.doc2vec.LabeledSentence(words=[u'invoic',u'bills',u'can',u'i',u'submit',u'from',u'pantaloon',u'claim'],tags=["SENT_16"]) 
sentence17 = models.doc2vec.LabeledSentence(words=[u'invoic',u'procedur',u'can',u'i',u'submit',u'invoic',u'from',u'spencer',u'claim'],tags=["SENT_17"]) 

# User asks a question. 

document = input("Ask a question:") 
tokenized_document = list(gensim.utils.tokenize(document, lowercase = True, deacc = True)) 
#print(type(tokenized_document)) 
stemmed_document = [] 
for w in tokenized_document: 
    stemmed_document.append(ps.stem(w)) 
sentence19 = models.doc2vec.LabeledSentence(words= stemmed_document, tags=["SENT_19"]) 

# Building vocab. 
sentences = [sentence0,sentence1,sentence2,sentence3, sentence4, sentence5,sentence6, sentence7, sentence8, sentence9, sentence10, sentence11, sentence12, sentence13, sentence14, sentence15, sentence16, sentence17, sentence19] 

#I tried to remove the stop words but it didn't work out as LabeledSentence object has no attribute lower. 
stoplist = set('for a of the and to in'.split()) 
texts = [[word for word in document.lower().split() if word not in stoplist] 
      for document in sentences] 
.. 

有沒有一種方法,我可以從sentences直接刪除停用詞,並得到一組新的詞彙沒有停止的話嗎?

回答

1

您的sentences對象已經是一個LabeledSentence對象的列表。你在上面構造這些;它們包含words中的字符串列表以及tags中的字符串列表。

因此,該列表中的每個項目(列表理解中的document)都不能使用像.lower()這樣的字符串方法。 (也不會需要它是.split(),其words已經分隔標記。)

最乾淨的方法是從列表-的字之前,他們已經習慣了構建LabeledSentence對象去除停止詞。例如,您可以在頂部定義一個函數without_stopwords()。然後你的線條創造LabeledSentence對象可以代替如:

sentence0 = LabeledSentence(words=remove_stopwords([u'sampl', u'what', u'is']), 
          tags=["SENT_0"]) 

或者,你可以變異現有LabeledSentence對象,使他們的每一個words屬性現在沒有停止的話。這將有更多的東西一樣更換你的最後一行:

for doc in sentences: 
    doc.words = [word for word in doc.words if word not in stoplist] 
texts = sentences 

另外,事情你沒問,但應該知道:

  • TaggedDocument現在是Doc2Vec文本對象的優選例子,類名 - 但事實上,具有所需屬性wordstags的任何對象都可以正常工作。

  • Doc2Vec在微小的玩具大小的數據集上不顯示許多期望的屬性 - 如果構建在幾十個句子上的模型沒有做任何有用的事情或者誤導什麼預處理/參數選項是最好的。 (成千上萬的文本和文本長度至少爲幾十字,對於有意義的結果要好得多)。

  • 很多Word2Vec/Doc2Vec工作並不打擾詞幹或停用詞的刪除,但它有時可能會有所幫助。

+0

是的,你是對的。這是不準確的,並在大多數時間給出錯誤的餘弦相似性,但它不能被幫助。這是提供給我的數據。這就是爲什麼我試圖檢查是否干擾詞或刪除詞會有所幫助。當我有一個樣本問題和答案清單時,您是否還可以建議我採用更好的方法來構建問答系統?謝謝。 – Kshitiz

+0

問答系統是一個相當廣泛的領域,可能需要的工作量可能比Doc2Vec多得多,並且取決於您擁有多少和種類的QA數據。對於新Q與以前Q的簡單相似性,Doc2Vec可能會有效 - 但您需要更多的培訓數據。另外還有一個有趣的句子相似技術叫做「Word Mover's Distance」,它只需要單詞(而不是每個文檔訓練好的矢量)。它可能適用於尋找最近類似的Q。它可以在gensim Word2Vec/KeyedVectors上作爲'wmdistance()'使用,但在大數據集上成對計算非常慢。 – gojomo