def train_classifier(): print "Training the classifier" system_classifier = Classifier.objects.first() system_classifier.status = "training" system_classifier.save() print "Fetching Chunks" chunks = Chunk.get_chunks() authors = [] fingerprints = [] for chunk in chunks: if chunk.author: authors.append(chunk.author.name) fingerprints.append(chunk.get_fingerprint_list()) print "Training..." clf = classifier.svm.train_svm(fingerprints, authors) if clf: print "Trained the classifier" store_trained_classifier.delay(clf) return True else: print "Failed to train classifier" system_classifier.status = "untrained" system_classifier.save() return False
def create_text_average_chunk(text_id): text = Text.objects.get(pk=text_id) if (text.average_chunk is not None): text.average_chunk.delete() chunks = Chunk.get_chunks().filter(text=text) print "averaging %i chunks" % (len(chunks)) average_fingerprint = Chunk.get_average_fingerprint_of_chunks(chunks) chunk = Chunk.objects.create() for key in average_fingerprint.keys(): setattr(chunk, key, average_fingerprint[key]) chunk.text = text chunk.save() text.average_chunk = chunk text.save() return True
def send_chunks(last_chunk_id): all_chunks = Chunk.select() new_chunk_id = last_chunk_id for db_data in all_chunks: if db_data.id > last_chunk_id: send_chunk(db_data) new_chunk_id = db_data.id return new_chunk_id
def create_author_average_chunk(author_id): author = Author.objects.get(pk=author_id) if (author.average_chunk is not None): author.average_chunk.delete() chunks = [] texts = Text.objects.filter(author=author) for text in texts: chunks.append(text.average_chunk) print "averaging %i chunks" % (len(chunks)) average_fingerprint = Chunk.get_average_fingerprint_of_chunks(chunks) chunk = Chunk.objects.create() for key in average_fingerprint.keys(): setattr(chunk, key, average_fingerprint[key]) chunk.author = author chunk.save() author.average_chunk = chunk author.status = "updated" author.save() return True
def make_chunks(fname_parsed): # fname_parsed: str -> generator '''ジェネレータ, 戻り値は1文のChunkクラスのリスト(yieldで返す)''' '''係り受け解析結果の様式(lineにはこれらのうちの1行のみ入っている) * 1 2D 0/1 -0.764522 吾輩 名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ,, は 助詞,係助詞,*,*,*,*,は,ハ,ワ,, ''' with open(fname_parsed) as file_parsed: chunks = dict() # idx: Chunk という形式の辞書 idx = -1 for line in file_parsed: # 1文の終了判定 if line == 'EOS\n': # Chunkのリストを返す if len(chunks) > 0: # chunksにChunkオブジェクトを追加する際にバラバラな順番で追加したため、順番通りに要素は並んでいない # chunksをkeyでソートし、valueのみ取り出し idx_chunk = sorted(chunks.items(), key=lambda x: x[0]) # keyでソート, 返り値はタプルのリスト yield list(zip(*idx_chunk))[1] # valueのみ(Chunkオブジェクトのみ)取り出せる(これらのChunkオブジェクトは順番通りになっている) chunks.clear() else: yield [] elif line[0] == '*': # Chunkのインデックス番号と係り先のインデックス番号を取得 '''文頭が'*'の行の様式 * 1 2D 0/1 -0.764522 ''' cols = line.split(' ') idx = int(cols[1]) # その文節自体のインデックス番号を取得 dst = int(re.search(r'(.*?)D', cols[2]).group(1)) # 正規表現を使ってその文節の係り先の文節のインデックス番号を取得 if idx not in chunks: # 辞書chunksのkeyにidxがないならばChunkを生成し係り先のインデックス番号を追加 chunks[idx] = Chunk() chunks[idx].dst = dst if dst != -1: # 係り先のChunkを生成し, その係り元の番号として今処理の対象となっている文節のインデックス番号を追加 if dst not in chunks: chunks[dst] = Chunk() chunks[dst].add_src(idx) # '*'でもEOS\nでもない行は形態素解析結果なので, Morphを作りchunksに追加 else: '''形態素解析結果の行の様式 吾輩 名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ,, ''' # 表層系はtab区切り, それ以外は','で区切る cols = line.split('\t') res_cols = cols[1].split(',') # Morph作成, Chunkオブジェクトのインスタンス変数morphsに生成したMorphを追加 chunks[idx].add_morph( Morph( cols[0], # surface res_cols[6], # base res_cols[0], # pos res_cols[1], # pos1 ) ) raise StopIteration