2013-10-17 60 views
2

我想用scikit-learn(或者nltk或其他建議打開)嘗試tfidf。我擁有的數據是我們在mongoDB中存儲的大量討論論壇帖子(~65k)。每個帖子都有帖子標題,帖子的日期和時間,帖子帖子的文本(或者re:如果是對現有帖子的回覆),用戶名,消息ID以及它是子帖還是父帖(在一個線程中,在那裏你有原始的帖子,然後回覆這個op,或嵌套的回覆,樹)。tf-idf文本文件的大小(65k)

我認爲每個帖子都是一個單獨的文檔,並且與20個新聞組類似,每個文檔都有我在頂部提到的字段,以及我將從mongo中提取的底部消息文本併爲每個文本文件寫入所需的格式。

對於將數據加載到scikit,我所知道的:
http://scikit-learn.org/dev/modules/generated/sklearn.datasets.load_files.html(但我的數據未分類) http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html - 對於輸入,我知道我會被使用的文件名,但因爲我有大量的文件(每個帖子),有沒有辦法從文本文件中讀取文件名?或者有人可以指示我實現一些示例實現嗎?

此外,在構建文件名的每一個論壇的帖子,因爲當我得到的TFIDF向量和餘弦相似陣列

感謝

後來識別任何建議

回答

5

你可以傳遞一個python generator或發電機表達式的文件名或字符串對象而不是列表,因此可以隨時從驅動器延遲加載數據。這裏是一個CountVectorizer服用發電機表達式作爲參數的玩具例子:

>>> from sklearn.feature_extraction.text import CountVectorizer 
>>> CountVectorizer().fit_transform(('a' * i for i in xrange(100))) 
<100x98 sparse matrix of type '<type 'numpy.int64'>' 
    with 98 stored elements in Compressed Sparse Column format> 

注意發電機支持可以使人們有可能直接將數據從一個MongoDB的查詢結果迭代器向量化,而不是去雖然文件名。

另外,每個10個字符的65k文件名的列表在內存中只有650kB(+ python列表的開銷),所以它應該不會提前加載所有文件名。

在構建文件名的每一個論壇的帖子,因爲當我得到的TFIDF向量和餘弦相似陣列後識別任何建議

只需使用一個確定的順序,以便能夠對列表進行排序在將它們饋送給矢量化器之前將文件名稱化。

+0

謝謝你,這是非常有幫助的。對於'有趣',我想直接從mongoDB獲取數據。在這種情況下,那麼查詢結果的順序將與向量和數組的順序相同....(我假設,但我會仔細檢查並在此發佈結果) – KBA

+0

是的,你必須[修復MongoDB查詢的順序](http://docs.mongodb.org/manual/reference/method/cursor.sort/)否則你將無法解釋哪個特徵向量來自哪個MongoDB文檔。 – ogrisel

0

我能得到這些任務。在情況下,它是有幫助的,下面是對指定一組文本文件,你要使用的代碼,然後如何設置標誌,並通過文件名

path = "/wherever/yourfolder/oftextfiles/are" 
filenames = os.listdir(path) 
filenames.sort() 

try: 
    filenames.remove('.DS_Store') #Because I am on a MAC 
except ValueError: 
    pass # or scream: thing not in some_list! 
except AttributeError: 
    pass # call security, some_list not quacking like a list! 

vectorizer = CountVectorizer(input='filename', analyzer='word', strip_accents='unicode', stop_words='english') 
X=vectorizer.fit_transform(filenames) 

蒙戈DB部分是基本的,但什麼它的價值(找到類型的所有條目按升序排列板卡ID 10和排序郵件ID):

cursor=coll.find({'boardid': 10 }).sort('messageid', 1)