2

scikit-learn (または nltk または他の提案を受け入れます) で tfidf を試してみたいと思います。私が持っているデータは、比較的大量のディスカッション フォーラムの投稿 (最大 65k) であり、収集して mongoDB に保存しています。各投稿には、投稿のタイトル、投稿の日時、投稿メッセージのテキスト (既存の投稿への返信の場合は re:)、ユーザー名、メッセージ ID、および子投稿か親投稿か (スレッド内) があります。 、元の投稿がある場所、次にこの op に返信するか、ネストされた返信、ツリー)。

各投稿は個別のドキュメントになると思います.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 ベクトルとコサイン類似度配列をいつ取得するかを特定できます。

ありがとう

4

2 に答える 2

5

リストの代わりにファイル名または文字列オブジェクトのpython ジェネレーターまたはジェネレーター式を渡すことができるため、ドライブからのデータの遅延ロードを行うことができます。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ベクトルとコサイン類似度配列をいつ取得するかを特定するために、これらのディスカッションフォーラムの投稿ごとにファイル名を構造化するためのアドバイス

決定論的な順序付けを使用して、ファイル名のリストをベクトライザーに渡す前に並べ替えることができます。

于 2013-10-17T06:51:36.823 に答える
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)

mongo db 部分は基本的なものですが、その価値はあります (boardid 10 タイプのすべてのエントリを検索し、messageid の昇順で並べ替えます)。

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

于 2013-11-11T06:43:59.890 に答える