LoginSignup
3
1

More than 5 years have passed since last update.

Djangoで形態素解析とマルコフ連鎖をやってみる(改善余地大アリ)

Last updated at Posted at 2016-11-21

はじめに

はるか昔にTwitterのデータを取得し、マルコフ連鎖。というのをやったのですが、Djangoに組み込んでみようとやってみました。結果を最初に言うと、問題大アリです。現時点での作業途中経過までを残しておこうと思います。

過去の記事はこちらから
Twitter検索で情報を溜め込み、形態素解析してマルコフ連鎖で文章を生成してツイート。

Python3では.has_key が使えないので、

if markov.has_key(w):

という処理は

if w in markov:

と書き換えるイメージです。

Python3でMeCabを使う準備

$ brew install mecab
$ brew install mecab-ipadic
$ pip install mecab-python3

こういう形でインストールしてみました。

コード

例によってDMM18禁動画のRSSを取りに行きます。

Djangoで作る簡易RSSリーダー
上記とほぼ同じことをやっていますので参考にどうぞ。

タイトルとディスクリプションを取得し保存します。

views.py
import feedparser
import MeCab
import random
import re
import sys, codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

from django.http import HttpResponse
from django.shortcuts import (render, redirect,)

def index(request):
    url = 'http://www.dmm.co.jp/digital/videoa/-/list/rss/=/sort=date/'
    feeder = feedparser.parse(url)


    for entry in feeder['entries']:
        lists = entry['description'] + entry['title']
        f = open('text.txt', 'w')
        f.write(lists)
        f.flush()
        f.close()

    f = open('text.txt', 'r')
    mecab_read = f.read()
    f.close()

    tagger = MeCab.Tagger('-Owakati')
    wordlist = tagger.parse(mecab_read)
    wordlist = wordlist.rstrip(' \n').split(' ')

    f = open('l.txt', 'w')
    f.write(str(wordlist))
    f.close()

    markov = {}
    w = ''

    for x in wordlist:
        if w:
            if w in markov:
                new_list = markov[w]
            else:
                new_list =[]

            new_list.append(x)
            markov[w] = new_list
        w = x

    choice_words = wordlist[0]
    sentence = ''
    count = 0

    while count < 20:
        choice_words = random.choice(wordlist)
        sentence += choice_words
        count += 1
        sentence = sentence.split(' ', 1)[0]
        p = re.compile('[!-/:-@[-`{-~]')
        sus = p.sub('', sentence)

    context = {
        'wordlist': wordlist,
        'sus': sus,
        }

    return render(request,'index.html',context)
index.html
{% extends "base.html" %}
{% block body %}
  <div class="container">
    <div class="row">

      <div class="col-md-12">
        <p class="1">{{ wordlist }}</p>
        <p class="2">{{ sus }}</p>
      </div>

    </div>
  </div>

{% endblock %}

結果

スクリーンショット 2016-11-21 13.41.16.png

このようなクソ結果に終わりました。
ディスクリプションには金額が入っちゃってるので除去しておかないと駄目ですね・・・。

女優名もカットしておかないと意味わからないことになることも分かりました。

精進します。

本来やりたかったこと

AVタイトルをマルコフ連鎖で作りたかったわけです。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1