[PYTHON] Fassen Sie den Titel von Hottentori in Hateb zusammen und schauen Sie sich die Gegenwart des Web an

Jetzt, da Google Reader vorbei ist und Dienste wie SmartNews und Gunosy, die empfohlene Inhalte auch im Schlaf anbieten, Aufmerksamkeit erregen, möchte ich hier etwas Kluges machen.

Also zog ich einen Artikel aus einem beliebten Eintrag in Hateb, Ich habe ein Programm geschrieben, um es in einer Zeile zusammenzufassen.

Ja das.

Zusammenfassung http://xiidec.appspot.com/markov.html

Wenn Sie dies verwenden ...

Die Wahrheit Japans ist, dass der faule Katzenlöwe den Elitekurs in diesem Land fahren kann.

So was

Was tun mit der Geschichte, Produktivität zu wollen, warum hochqualifizierte diskriminierende Bemerkungen erforderlich sind?

Die Nachrichten zum Thema sind gemischt und in einer Zeile zusammengefasst.

In Bezug auf Ayumi Hamasaki erreichte der Reaktor nicht genug, und diskriminierende Bemerkungen zum Kernschmelzen wurden fortgesetzt.

Sie können den aktuellen Status des Web in einer Zeile sehen!

Wie es funktioniert

  1. Rufen Sie auf der Serverseite (Python) das RSS des beliebten Hatena-Lesezeicheneintrags ab.
  2. Zerlegen Sie Wörter mit morphologischer Analyse tiny_segmenter, die mit Javascript funktioniert.
  3. Rekonstruiert mit der Markov-Kette, einem Algorithmus, der häufig für Bot verwendet wird.

Es ist fast so.

Ich miete einen (kostenlosen) Google App Engine-Server und führe ihn aus. Der Mechanismus zum Abrufen von Futtermitteln ist fast der gleiche wie bei Futtermittelparser nimmt automatisch Katzenbilder auf. Geben Sie es an den Kunden weiter.

Der Client zerlegt dann die empfangene Zeichenfolge mit einer magischen Javascript-Bibliothek namens TinySegmenter in Wörter.

Heute ist ein schöner Tag. ↓ heute|Ist|gut|Wetter|ist|Hallo|。

Ein solches Bild.

Und es wird unter Verwendung eines Algorithmus namens Markov-Kette rekonstruiert. Weitere Informationen finden Sie in den [Markov-Kettenartikeln] von Wikipedia (http://en.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%82%B3%E3%83%95%E9%) Ich glaube nicht, dass Sie es sehr gut verstehen können, wenn Sie 80% A3% E9% 8E% 96) lesen, aber wenn Sie es grob erklären,

Heute → ist → gut → Wetter → ist → ne →. I → ist → Katze → ist → ist →. → Name → → Noch nicht → Nicht verfügbar →. Übergabe → → → Keine Waffe → → Kind → → Herum → Von → Verlust → Nur →.

Angenommen, es gibt mehrere Sätze.

Zunächst wird das erste Wort zufällig abgerufen. → "Heute" Das einzige Wort, das "heute" folgt, ist "ha". → "Heute" Die Wörter nach "ha" sind "gut" und "Katze". Wählen Sie zufällig. → "Heute ist eine Katze" Das einzige Wort, das einer Katze folgt, ist "de". → "Heute ist eine Katze" Die Wörter nach "de" sind "aru" und "Kinder". Wählen Sie auch nach dem Zufallsprinzip. → "Heute ist eine Katze und ein Kind" Neben "Kinder" ist eine andere Wahl. → "Heute ist eine Katze und ein Kind" Neben "nein" stehen "keine Waffe" und "herum". → "Heute ist eine Katze und eine Kinderwaffe" Neben "Muteppou" wird erneut "de" ausgewählt. → "Heute ist eine Waffe für eine Katze und ein Kind ohne Waffe" Lass es uns beenden. → "Heute ist eine Katze und eine Kinderwaffe."

Es stellte sich heraus, dass es so etwas war. Die Markov-Kette ist tatsächlich etwas tiefer. Eine schwierige Formel kommt heraus. Was auch immer die Theorie sein mag, hoffen wir, dass es dadurch so wird.

Quelle

Dies ist die Quelle auf der Serverseite.

markov.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import webapp2
import os
from google.appengine.ext.webapp import template
from xml.etree.ElementTree import *
import re

import urllib

class Markov(webapp2.RequestHandler):
	def get(self):
		mes=""
		if self.request.get('mode')=="2ch":
			mes=self.get_2ch()
		else:
			mes=self.get_hotentry_title()
		
		template_values={
		'mes':mes
		}
		path = os.path.join(os.path.dirname(__file__), 'html/markov.html')
		self.response.out.write(template.render(path, template_values))
		
	def get_hotentry_title(self):
		titles = ""
		tree = parse(urllib.urlopen('http://feeds.feedburner.com/hatena/b/hotentry'))
		for i in tree.findall('./{http://purl.org/rss/1.0/}item'):
			titles+= re.sub("[-:|/|:].{1,30}$","",i.find('{http://purl.org/rss/1.0/}title').text) + "\n"
		return titles
		
	def get_2ch(self):
		titles = ""
		response = urllib.urlopen('http://engawa.2ch.net/poverty/subject.txt')
		html = unicode(response.read(), "cp932", 'ignore').encode("utf-8")
		for line in html.split("\n"):
			if line != "":
				titles+=re.sub("\(.*?\)$","",line.split("<>", 2)[1])+ "\n"
		return titles
		
app = webapp2.WSGIApplication([
	('/markov.html', Markov)
], debug=True)

Die get-Methode der Markov-Klasse ist die Methode, die funktioniert, wenn der Benutzer darauf zugreift. get_hotentry_title () ruft eine Liste beliebter Einträge ab und übergibt sie an markov.html. ElementTree wird verwendet, um RSS zu erhalten. Es schien ein Problem zu sein, Feedparser für GAE zu verwenden.

get_2ch () ist eine zusätzliche Funktion. Ich werde den Faden von 2ch anstelle des Eingangs des Endes aufheben. Fügen Sie am Ende der URL "? Mode = 2ch" hinzu, um den 2ch-Modus zu erhalten. Wenn Sie die Funktion zum Ändern der abgerufenen Informationen gemäß den folgenden Parametern erweitern, wird sich Ihr Traum ausbreiten.

re.sub("[-:|/|:].{1,30}$”,””,~~~)

Diese mysteriöse Beschreibung heißt re. Dadurch werden unnötige Geräusche vermieden.

Nur ein klarer Weg, um select ◯◯ 100 Auswahlen-XX Blog zu machen

Löschen Sie das "-XX-Blog" mit einem solchen Titel, um es einfach zu machen.

Als nächstes kommt die Client-Seite.

markov.html



<html>
    <head>
    </head>
    <body style="">
        <p>&nbsp;</p>
        <p>
        <meta charset="UTF-8">
        <title>Zusammenfassung-Kun</title>
        <link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" />
	<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
		<script type="text/javascript" src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"></script>
			<script type="text/javascript" src="jscss/tiny_segmenter-0.1.js" charset="UTF-8">
        </script> <script type="text/javascript">
	var segmenter
	$(function(){
		segmenter = new TinySegmenter();//Instanzgenerierung
	})
	//Lauf
	function doAction(){
		var wkIn=$("#txtIN").val()//Eingang
		var segs = segmenter.segment(wkIn);  //Gibt ein Array von Wörtern zurück
		var dict=makeDic(wkIn)
		var wkbest=doShuffle(dict);	
		for(var i=0;i<=10;i++){
		wkOut=doShuffle(dict).replace(/\n/g,"");	
			if(Math.abs(40-wkOut.length)<Math.abs(40-wkbest.length)){
				wkbest=wkOut
			}
		}
		
		$("#txtOUT").val(wkbest);//Ausgabe
		
	}
	//Mische Sätze
	function doShuffle(wkDic){
		var wkNowWord=""
		var wkStr=""
		wkNowWord=wkDic["_BOS_"][Math.floor( Math.random() * wkDic["_BOS_"].length )];
		wkStr+=wkNowWord;
		while(wkNowWord != "_EOS_"){
			wkNowWord=wkDic[wkNowWord][Math.floor( Math.random() * wkDic[wkNowWord].length )];
			wkStr+=wkNowWord;
		}
		wkStr=wkStr.replace(/_EOS_$/,"。")
		return wkStr;
	}
	//Zum Wörterbuch hinzufügen
	function makeDic(wkStr){
		wkStr=nonoise(wkStr);
		var wkLines= wkStr.split("。");
		var wkDict=new Object();
		for(var i =0;i<=wkLines.length-1;i++){
			var wkWords=segmenter.segment(wkLines[i]);
			if(! wkDict["_BOS_"] ){wkDict["_BOS_"]=new Array();}
			if(wkWords[0]){wkDict["_BOS_"].push(wkWords[0])};//Satzanfang

			for(var w=0;w<=wkWords.length-1;w++){
				var wkNowWord=wkWords[w];//Nun Wort
				var wkNextWord=wkWords[w+1];//Nächstes Wort
				if(wkNextWord==undefined){//Ende des Satzes
					wkNextWord="_EOS_"
				}
				if(! wkDict[wkNowWord] ){
					wkDict[wkNowWord]=new Array();
				}
				wkDict[wkNowWord].push(wkNextWord);
				if(wkNowWord=="、"){//"," Kann als Satzanfang verwendet werden.
					wkDict["_BOS_"].push(wkNextWord);
				}
			}
			
		}
		return wkDict;
	}
	
	//Geräuschreduzierung
	function nonoise(wkStr){
		wkStr=wkStr.replace(/\n/g,"。");
		wkStr=wkStr.replace(/[\?\!?!]/g,"。");
		wkStr=wkStr.replace(/[-||:: ・]/g,"。");
		wkStr=wkStr.replace(/[「」()\(\)\[\]【】]/g," ");
		return wkStr;
	}	
</script>  </meta>
<div data-role="page" id="first">
	<div data-role="content">	

        <p>Um die aktuellen Artikel im Internet in einer Zeile zusammenzufassen ...</p>
					<p><textarea cols="60" rows="8" name="txtIN" id="txtIN"  style="max-height:200px;">{{ mes }}</textarea></p>
        <input type="button" name="" value="Generieren" onClick=" doAction()"></br>
        <textarea cols="60" rows="8" name="txtIN" id="txtOUT"></textarea>
        <p></p>

</div>
</div>
</body>
</html>

Wow vermasselt. Erstens, doAction (), ist dies die Hauptfunktion. Die von segmenter.segment (wkIN) empfangene Zeichenkette wird in Teile zerlegt. Erstellen Sie darauf basierend ein Wörterbuch mit Satzverbindungen mit makeDic (). Mischen Sie es danach 10 Mal mit doShuffle () und übernehmen Sie die Zeichenfolge, die 40 Zeichen am nächsten kommt.

Komplett.

Es scheint, dass verschiedene Verbesserungen vorgenommen werden können, indem die aus dem Web abgerufenen Informationen oder die Bewertungskriterien für gemischte Sätze nach Ihren Wünschen geändert werden.

Zusammenfassung

Nicht sehr praktisch.

Recommended Posts

Fassen Sie den Titel von Hottentori in Hateb zusammen und schauen Sie sich die Gegenwart des Web an
Python-Grundkurs (Ende 15)
Fassen Sie die wichtigsten Wachstumspunkte von Webdiensten und die Analysepunkte zusammen
Werfen wir einen Blick auf den Scapy-Code. Überladung spezieller Methoden __div__, __getitem__.
Senden Sie Google Mail am Ende des Vorgangs [Python]
Zum Zeitpunkt des Python-Updates mit Ubuntu
Die epidemische Vorhersage des neuen Koronavirus wurde mit explosiver Geschwindigkeit im Internet veröffentlicht
Entfernen Sie eine bestimmte Zeichenfolge am Ende von Python
[Python3] Machen Sie einen Screenshot einer Webseite auf dem Server und schneiden Sie sie weiter zu
Schauen Sie sich die Go-Punktzahl eines professionellen Go-Spielers an
Führen Sie einen Befehl auf dem Webserver aus und zeigen Sie das Ergebnis an
Wie man einen bestimmten Prozess am Anfang und Ende der Spinne mit Scrapy einfügt
Versuchen Sie es mit dem Python-Webframework Django (2). Schauen Sie sich settings.py an
Dekorateur, der am Ende der Methode "FIN-Methodenname" anzeigt
Die Geschichte, ein Tool zu erstellen, das auf Mac und Windows auf der Spieleentwicklungsseite ausgeführt wird
Werfen wir einen Blick auf die Feature-Map von YOLO v3
Erfassen Sie GeneratorExit und erkennen Sie das Ende der Iteration von der Generatorseite
Installieren und verwalten Sie mehrere Umgebungen derselben Distribution in WSL
Verwendung von Jupyter am Frontend von Spacon ITO
Schauen wir uns den Waldbrand an der Westküste der USA mit Satellitenbildern an.