コーパス内におけるクエリの表現
受付中
回答 1
投稿
- 評価
- クリップ 0
- VIEW 809
やりたいこと
こちらを参考にして実装中のプログラムで作成したコーパスの類似度を求めようと思っているのですが、
サンプルコード内で
#クエリを特徴ベクトルで表現
query = [(0,1)(4,1)]
#queryと類似するもの上位10件を出力
print softed(enumerate(index[query]), reverse = True, key = lambda x:x[1])[:10]
というふうにクエリが表現されているのですが、
クエリのインデックス?部分([(0,1),(4,1)])の数字
がコーパスや辞書などのどの数字に対応しているのかを教えていただきたいです。
実装中のコード
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
トピックモデル(入力:novel_setの全ての.txtファイル)
各ファイルの管理可能
形態素解析対象:名詞(代名詞,非自立名詞,数,固有名詞を除く)
"""
import time
import glob
import MeCab
from gensim import corpora, models, similarities
t0 = time.time()
"""
file_list[file_no]:ファイル番号file_noのファイル名
"""
file_list = glob.glob('novel_set/*.txt')
#形態素解析(文字列を改行位置で区切って分割)
mecab = MeCab.Tagger ("-Ochasen")
texts = []
for file in file_list:
f = open(file, "r",encoding = "utf-8")
text = f.read()
f.close()
chunks = mecab.parse(text).splitlines()
#絞り込み
sels = []
for chunk in chunks:
cols = chunk.split('\t')
if len(cols) >= 4:
parts = cols[3].split('-')
#指定した品詞で始まっている場合 → true
if parts[0].startswith('名詞'):
#代名詞,非自立名詞,固有名詞,数を含めない
if parts[1] in ['代名詞','非自立','固有名詞','数']:
continue
#形態素を追加
#sels:形態素(原形)のみの行列
sels.append(cols[2])
texts.append(sels)
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]
index = similarities.docsim.SparseMatrixSimilarity(corpus,num_features = len(dictionary))
t1 = time.time()
#トピック数
num_topics = 10
#LDAモデルに投入
lda = models.LdaModel(corpus = corpus, id2word = dictionary, num_topics = num_topics)
lda.save('lda.model')
t2 = time.time()
print(lda)
#各トピックにおける各トークンの出現確率を係数で表示
for topic in lda.show_topics(-1):
print(topic)
print('ファイル数:%d'%len(file_list))
corpus_time = t1 - t0
print('コーパス生成時間:%f秒'%corpus_time)
lda_time = t2 -t1
print('LDAモデル生成時間:%f秒'%lda_time)
total_time = t2 - t0
print('合計時間:%f秒'%total_time)
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
http://hivecolor.com/id/58
の
doc2bow()はdistinctした結果から単語の出現回数を数えます。
[(0, 1), (1, 1)]という出力結果から、computerの辞書内のIDは0で今回の出現回数1回、humanの辞書内のIDは1で今回の出現回数は1回、interctionは辞書に入っていない(なので無視された)、ということが分かります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.11%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/11/28 18:16
クエリ[(0,1)j,(4,1)]の場合、
「辞書内ID0の単語が1回かつ辞書内ID4の単語が1回出ている文書」という意味で、
分析したいファイルの特徴ベクトルを見つけないといけないということでしょうか?
2017/11/28 18:23
後半の質問はどのような意味でしょうか。
ファイルがあるのであれば、
query = dic.doc2bow(parse(file_content))
で特徴ベクトルをゲットできます。
2017/11/29 15:33
file_list[]の要素の1つに変更すれば求められるということでしょうか?