Пример #1
0
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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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