[PYTHON] Fordern Sie heraus, Yahoo! News-Überschriften nur mit der COTOHA-API zu generieren

Einführung

Die COTOHA API führt eine Kollaborationskampagne mit Qiita durch. FF7 wird bald neu gemacht und ich möchte PS4 .. (-p-)

https://zine.qiita.com/event/collaboration-cotoha-api/

Es ist ein völlig unreines Motiv, aber ich habe versucht, die natürliche Sprache mit der COTOHA-API zu verarbeiten. Heute ist die Frist für die Veröffentlichung, also ist es ziemlich eng, aber ich habe es geschafft ...

Was ich getan habe

Ich habe versucht, Nachrichtenartikel nur mit der von COTOHA bereitgestellten API zusammenzufassen. Das Thema ist ** Yahoo! News Überschriftengenerierung **.

Yahoo! News Überschrift

Wie Sie alle wissen, hat jeder Artikel eine Überschrift. Zum Beispiel sieht es wie folgt aus.

スクリーンショット 2020-03-10 23.54.59.png

Diese Überschrift, die ich normalerweise beiläufig sehe, wird tatsächlich nach verschiedenen Regeln erstellt und ist tief.

Erstens, um auf engstem Raum einfach und konsequent zu kommunizieren Die Anzahl der Zeichen ist auf ** bis zu 13 Zeichen ** begrenzt (um genau zu sein 13,5 Zeichen einschließlich Leerzeichen halber Breite).

Die Überschrift enthält auch ** Standortinformationen **. Im Falle eines Vorfalls oder Unfalls variieren die Bedeutung von Nachrichten und das Interesse der Benutzer stark, je nachdem, wo sie auftreten.

Und die in den Überschriften verwendeten Wörter sind im Grunde ** Wörter im Artikel **. Weil die Artikel auf jedes Medium verteilt werden, es sei denn, sie passen nicht in die Anzahl der Zeichen Es scheint, dass er dies tut, um den Inhalt des Artikels nicht zu verdrehen.

Wenn Sie eine Überschrift mit den Wörtern im Artikel erstellen möchten, verwenden Sie die COTOHA-API Ich dachte, ich könnte es bis zu einem gewissen Grad tun.

Es gibt andere Regeln, aber die Regeln, die wir dieses Mal behandelt haben, sind unten zusammengefasst.

[Referenz] Das Geheimnis der Yahoo! News-Themen "13-stellige Überschrift" https://news.yahoo.co.jp/newshack/inside/yahoonews_topics_heading.html

COTOHA API ** API für die Verarbeitung natürlicher Sprache und Spracherkennung ** von NTT Communications. Es werden 14 APIs für die Verarbeitung natürlicher Sprache und die Sprachverarbeitung wie Syntaxanalyse und Spracherkennung bereitgestellt. https://api.ce-cotoha.com/contents/index.html

Dieses Mal habe ich die ** Entwicklerversion ** der COTOHA-API verwendet. Im Vergleich zur Enterprise-Version gibt es einige Einschränkungen, die Sie jedoch kostenlos verwenden können.

Artikel, die diesmal ins Visier genommen wurden

Dieses Mal habe ich mich auf den folgenden Artikel konzentriert, den Bill Gates von MS zurückgezogen hat. https://news.yahoo.co.jp/pickup/6354056

Hier ist die Überschrift, die angehängt wurde.

Bill Gates geht als MS-Direktor in den Ruhestand

Umm. Sicher vollständig und leicht zu verstehen.

Schritt 1: Fordern Sie zunächst nur die Zusammenfassungs-API heraus

Die COTOHA-API bietet eine ** zusammenfassende API **. Obwohl es sich noch in der Beta befindet, können Sie damit ** Sätze extrahieren, die Sie für wichtig im Satz halten **.

Zunächst habe ich beschlossen, einen Satz mit dieser API zu extrahieren.

{
  "result": "Gates schied 2008 aus der Geschäftsleitung aus und trat 2014 als Vorsitzender in den Ruhestand, blieb jedoch im Verwaltungsrat.",
  "status": 0
}

Ich konnte es sicher extrahieren, aber es überschreitet deutlich 13 Zeichen, also muss ich es ** kürzen **. Ich war besorgt darüber, wie ich es verkürzen könnte, aber ich entschied mich, mit der Methode fortzufahren, ** nur die Schlüsselwörter mit hoher Bedeutung zu belassen **.

Schritt 2: Extrahieren Sie wichtige Wörter mithilfe der Keyword-Extraktions-API

Zuvor habe ich in Qiitas Artikel geschrieben, dass Sie Schlüsselwörter mit hoher Bedeutung mithilfe von "Begriffsextrakt" extrahieren können.

[Referenz] Automatischer Generator für Qiita-Tags https://qiita.com/fukumasa/items/7f6f69d4f6336aff3d90

Die COTOHA-API bietet auch eine ** Keyword-Extraktions-API **. Im Text enthaltene charakteristische Phrasen und Wörter können als Schlüsselwörter extrahiert werden.

Extrahieren wir Schlüsselwörter für den einen Satz, der zuvor extrahiert wurde.

{
  "result": [
    {
      "form": "Präsident",
      "score": 14.48722
    },
    {
      "form": "Linie",
      "score": 11.3583
    },
    {
      "form": "Im Ruhestand",
      "score": 11.2471
    },
    {
      "form": "der Aufsichtsrat",
      "score": 10.0
    }
  ],
  "status": 0,
  "message": ""
}

Zu diesem Zeitpunkt bin ich schon misstrauisch ... ** Die wesentlichen Informationen "wer" ** (Mr. Gates) wurden nicht extrahiert. Nun, ich werde vorerst weitermachen.

Schritt 3: Extrahieren Sie Standortinformationen mithilfe der API zum Extrahieren eindeutiger Ausdrücke

Wie ich in der Eröffnungsregel geschrieben habe, muss die Überschrift Standortinformationen enthalten. COTOHA bietet eine praktische API zum Abrufen von Standortinformationen. ** Eindeutige Ausdrucksextraktions-API **. Mithilfe dieser API können Sie eindeutige Ausdrücke wie Personennamen und Ortsnamen abrufen.

Ich habe es mit dem einen Satz versucht, den ich zuvor extrahiert habe, aber er enthielt keine Standortinformationen.

Wenn es enthalten ist, ist es sehr einfach, aber ** "Standortinformationen extrahiert" mit "de" ** Ich habe beschlossen, es am Anfang der Zusammenfassung aufzunehmen.

Schritt 4: Fügen Sie Schlüsselwörtern mithilfe der Syntaxanalyse-API Hilfswörter hinzu

Es scheint schwierig zu sein, eine Überschrift (einen Satz) nur durch Anordnen dieser extrahierten Schlüsselwörter zu generieren. Ich konnte keine fortgeschrittenen Dinge tun, um automatisch Sätze basierend auf Schlüsselwörtern zu generieren, und ich war ziemlich besorgt.

Da ich die Einschränkung auferlege, nur die COTOHA-API zu verwenden, blitzte eine auf, als ich die API-Liste erneut betrachtete. Mit der ** Syntaxanalyse-API ** können Sie jedem extrahierten Schlüsselwort ** Hilfswörter wie "ga" und "o" hinzufügen, um jedes Schlüsselwort zu verbinden **.

Mithilfe dieser API wird der Text in Klauseln und Morphologie sowie in die Abhängigkeitsbeziehungen zwischen Klauseln und zerlegt Abhängigkeitsbeziehungen zwischen morphologischen Elementen, semantischen Informationen wie Teiltextinformationen usw. werden hinzugefügt.

Gibt es eine Beziehung zwischen den extrahierten Schlüsselwörtern und den Hilfswörtern? (Ich weiß nicht, wie ich es ausdrücken soll ...) scheint extrahiert werden zu können. Im Fall von "Luft ist köstlich" ist es beispielsweise so, als würde man "ga" als Hilfswort für das Schlüsselwort "Luft" extrahieren.

Verwenden Sie diese API, um dem vorherigen Schlüsselwort ein Hilfswort hinzuzufügen.

Rückgabe der Antwort (gefaltet, weil sie lang ist)
{
  "result": [
    {
      "chunk_info": {
        "id": 0,
        "head": 7,
        "dep": "D",
        "chunk_head": 1,
        "chunk_func": 2,
        "links": []
      },
      "tokens": [
        {
          "id": 0,
          "form": "Tore",
          "kana": "Tore",
          "lemma": "Tore",
          "pos": "Substantiv",
          "features": [
            "Einzigartig",
            "Nachname"
          ],
          "attributes": {}
        },
        {
          "id": 1,
          "form": "Herr",
          "kana": "Shi",
          "lemma": "Herr",
          "pos": "Nomenklatursuffix",
          "features": [
            "Substantiv"
          ],
          "dependency_labels": [
            {
              "token_id": 0,
              "label": "name"
            },
            {
              "token_id": 2,
              "label": "case"
            }
          ],
          "attributes": {}
        },
        {
          "id": 2,
          "form": "Ist",
          "kana": "C.",
          "lemma": "Ist",
          "pos": "Aufeinanderfolgende Hilfswörter",
          "features": [],
          "attributes": {}
        }
      ]
    },
    {
      "chunk_info": {
        "id": 1,
        "head": 4,
        "dep": "D",
        "chunk_head": 0,
        "chunk_func": 1,
        "links": []
      },
      "tokens": [
        {
          "id": 3,
          "form": "2008",
          "kana": "Nisen Hachinen",
          "lemma": "2008",
          "pos": "Substantiv",
          "features": [
            "Datum (und Uhrzeit"
          ],
          "dependency_labels": [
            {
              "token_id": 4,
              "label": "case"
            }
          ],
          "attributes": {}
        },
        {
          "id": 4,
          "form": "Zu",
          "kana": "D.",
          "lemma": "Zu",
          "pos": "Fallassistent",
          "features": [
            "Dauereinsatz"
          ],
          "attributes": {}
        }
      ]
    },
    {
      "chunk_info": {
        "id": 2,
        "head": 3,
        "dep": "D",
        "chunk_head": 0,
        "chunk_func": 1,
        "links": []
      },
      "tokens": [
        {
          "id": 5,
          "form": "Management",
          "kana": "Keiei",
          "lemma": "Management",
          "pos": "Substantiv",
          "features": [
            "Bewegung"
          ],
          "dependency_labels": [
            {
              "token_id": 6,
              "label": "case"
            }
          ],
          "attributes": {}
        },
        {
          "id": 6,
          "form": "von",
          "kana": "Nein",
          "lemma": "von",
          "pos": "Fallassistent",
          "features": [
            "Union"
          ],
          "attributes": {}
        }
      ]
    },
    {
      "chunk_info": {
        "id": 3,
        "head": 4,
        "dep": "D",
        "chunk_head": 0,
        "chunk_func": 1,
        "links": [
          {
            "link": 2,
            "label": "adjectivals"
          }
        ]
      },
      "tokens": [
        {
          "id": 7,
          "form": "Linie",
          "kana": "Issen",
          "lemma": "Linie",
          "pos": "Substantiv",
          "features": [],
          "dependency_labels": [
            {
              "token_id": 5,
              "label": "nmod"
            },
            {
              "token_id": 8,
              "label": "case"
            }
          ],
          "attributes": {}
        },
        {
          "id": 8,
          "form": "Von",
          "kana": "Kara",
          "lemma": "Von",
          "pos": "Fallassistent",
          "features": [
            "Dauereinsatz"
          ],
          "attributes": {}
        }
      ]
    },
    {
      "chunk_info": {
        "id": 4,
        "head": 7,
        "dep": "P",
        "chunk_head": 0,
        "chunk_func": 1,
        "links": [
          {
            "link": 1,
            "label": "goal"
          },
          {
            "link": 3,
            "label": "object"
          }
        ],
        "predicate": []
      },
      "tokens": [
        {
          "id": 9,
          "form": "In den Ruhestand gehen",
          "kana": "Sirizo",
          "lemma": "In den Ruhestand gehen",
          "pos": "Verbstamm",
          "features": [
            "K"
          ],
          "dependency_labels": [
            {
              "token_id": 3,
              "label": "nmod"
            },
            {
              "token_id": 7,
              "label": "dobj"
            },
            {
              "token_id": 10,
              "label": "aux"
            },
            {
              "token_id": 11,
              "label": "punct"
            }
          ],
          "attributes": {}
        },
        {
          "id": 10,
          "form": "Ki",
          "kana": "Ki",
          "lemma": "Ki",
          "pos": "Verbsuffix",
          "features": [
            "Dauereinsatz"
          ],
          "attributes": {}
        },
        {
          "id": 11,
          "form": "、",
          "kana": "",
          "lemma": "、",
          "pos": "Lesepunkt",
          "features": [],
          "attributes": {}
        }
      ]
    },
    {
      "chunk_info": {
        "id": 5,
        "head": 7,
        "dep": "D",
        "chunk_head": 0,
        "chunk_func": 1,
        "links": []
      },
      "tokens": [
        {
          "id": 12,
          "form": "14 Jahre",
          "kana": "Juyonen",
          "lemma": "14 Jahre",
          "pos": "Substantiv",
          "features": [
            "Datum (und Uhrzeit"
          ],
          "dependency_labels": [
            {
              "token_id": 13,
              "label": "case"
            }
          ],
          "attributes": {}
        },
        {
          "id": 13,
          "form": "Zu",
          "kana": "Niha",
          "lemma": "Zu",
          "pos": "Aufeinanderfolgende Hilfswörter",
          "features": [],
          "attributes": {}
        }
      ]
    },
    {
      "chunk_info": {
        "id": 6,
        "head": 7,
        "dep": "D",
        "chunk_head": 0,
        "chunk_func": 1,
        "links": []
      },
      "tokens": [
        {
          "id": 14,
          "form": "Präsident",
          "kana": "Kaicho",
          "lemma": "Präsident",
          "pos": "Substantiv",
          "features": [],
          "dependency_labels": [
            {
              "token_id": 15,
              "label": "case"
            }
          ],
          "attributes": {}
        },
        {
          "id": 15,
          "form": "Zu",
          "kana": "Wo",
          "lemma": "Zu",
          "pos": "Fallassistent",
          "features": [
            "Dauereinsatz"
          ],
          "attributes": {}
        }
      ]
    },
    {
      "chunk_info": {
        "id": 7,
        "head": 9,
        "dep": "D",
        "chunk_head": 0,
        "chunk_func": 3,
        "links": [
          {
            "link": 0,
            "label": "agent"
          },
          {
            "link": 4,
            "label": "manner"
          },
          {
            "link": 5,
            "label": "time"
          },
          {
            "link": 6,
            "label": "agent"
          }
        ],
        "predicate": [
          "past"
        ]
      },
      "tokens": [
        {
          "id": 16,
          "form": "Im Ruhestand",
          "kana": "Tinin",
          "lemma": "Im Ruhestand",
          "pos": "Substantiv",
          "features": [
            "Bewegung"
          ],
          "dependency_labels": [
            {
              "token_id": 1,
              "label": "nsubj"
            },
            {
              "token_id": 9,
              "label": "advcl"
            },
            {
              "token_id": 12,
              "label": "nmod"
            },
            {
              "token_id": 14,
              "label": "nsubj"
            },
            {
              "token_id": 17,
              "label": "aux"
            },
            {
              "token_id": 18,
              "label": "aux"
            },
            {
              "token_id": 19,
              "label": "mark"
            },
            {
              "token_id": 20,
              "label": "punct"
            }
          ],
          "attributes": {}
        },
        {
          "id": 17,
          "form": "Shi",
          "kana": "Shi",
          "lemma": "Shi",
          "pos": "Verbale Nutzung endet",
          "features": [],
          "attributes": {}
        },
        {
          "id": 18,
          "form": "Ta",
          "kana": "Ta",
          "lemma": "Ta",
          "pos": "Verbsuffix",
          "features": [
            "Verbindung"
          ],
          "attributes": {}
        },
        {
          "id": 19,
          "form": "Aber",
          "kana": "Ga",
          "lemma": "Aber",
          "pos": "Verbindungssuffix",
          "features": [
            "Dauereinsatz"
          ],
          "attributes": {}
        },
        {
          "id": 20,
          "form": "、",
          "kana": "",
          "lemma": "、",
          "pos": "Lesepunkt",
          "features": [],
          "attributes": {}
        }
      ]
    },
    {
      "chunk_info": {
        "id": 8,
        "head": 9,
        "dep": "D",
        "chunk_head": 0,
        "chunk_func": 1,
        "links": []
      },
      "tokens": [
        {
          "id": 21,
          "form": "der Aufsichtsrat",
          "kana": "Trishimaryakukai",
          "lemma": "der Aufsichtsrat",
          "pos": "Substantiv",
          "features": [],
          "dependency_labels": [
            {
              "token_id": 22,
              "label": "case"
            }
          ],
          "attributes": {}
        },
        {
          "id": 22,
          "form": "Zu",
          "kana": "Niha",
          "lemma": "Zu",
          "pos": "Aufeinanderfolgende Hilfswörter",
          "features": [],
          "attributes": {}
        }
      ]
    },
    {
      "chunk_info": {
        "id": 9,
        "head": -1,
        "dep": "O",
        "chunk_head": 0,
        "chunk_func": 4,
        "links": [
          {
            "link": 7,
            "label": "manner"
          },
          {
            "link": 8,
            "label": "place"
          }
        ],
        "predicate": [
          "past",
          "past"
        ]
      },
      "tokens": [
        {
          "id": 23,
          "form": "Verbleibend",
          "kana": "Noko",
          "lemma": "Bleiben übrig",
          "pos": "Verbstamm",
          "features": [
            "R"
          ],
          "dependency_labels": [
            {
              "token_id": 16,
              "label": "advcl"
            },
            {
              "token_id": 21,
              "label": "nmod"
            },
            {
              "token_id": 24,
              "label": "aux"
            },
            {
              "token_id": 25,
              "label": "aux"
            },
            {
              "token_id": 26,
              "label": "aux"
            },
            {
              "token_id": 27,
              "label": "aux"
            },
            {
              "token_id": 28,
              "label": "punct"
            }
          ],
          "attributes": {}
        },
        {
          "id": 24,
          "form": "Tsu",
          "kana": "Tsu",
          "lemma": "Tsu",
          "pos": "Verbale Nutzung endet",
          "features": [],
          "attributes": {}
        },
        {
          "id": 25,
          "form": "Hand",
          "kana": "Te",
          "lemma": "Hand",
          "pos": "Verbsuffix",
          "features": [
            "Verbindung",
            "Dauereinsatz"
          ],
          "attributes": {}
        },
        {
          "id": 26,
          "form": "ich",
          "kana": "ich",
          "lemma": "Ist",
          "pos": "Verbstamm",
          "features": [
            "A",
            "L für den Dauereinsatz"
          ],
          "attributes": {}
        },
        {
          "id": 27,
          "form": "Ta",
          "kana": "Ta",
          "lemma": "Ta",
          "pos": "Verbsuffix",
          "features": [
            "halt"
          ],
          "attributes": {}
        },
        {
          "id": 28,
          "form": "。",
          "kana": "",
          "lemma": "。",
          "pos": "Phrase",
          "features": [],
          "attributes": {}
        }
      ]
    }
  ],
  "status": 0,
  "message": ""
}
['Vorsitzende', 'Von der Linie', 'Im Ruhestand', 'An die Tafel']

Schritt 5: Überschrift generieren!

Kombinieren wir jedes Schlüsselwort mit dem Hilfswort, um einen Satz mit maximal 13 Zeichen zu bilden. Ich habe es in Schritt 4 fast geschafft, aber ich habe dieses Ergebnis bekommen.

Aus der Leitung ausgeschieden

Ich denke nicht, dass es eine faszinierende Überschrift ist **, "Wer ist in Rente gegangen?", Aber es sind falsche Informationen, weil ich den Direktor anstelle des Vorsitzenden verlassen habe. Ich werde es dir erzählen.

Wie ich in Schritt 2 geschrieben habe, gibt es jedoch keine Informationen, die "wer" oder Firmennamen wie "Microsoft" und "MS" sagen. Daher fühlt es sich subtil an. Daher ist es objektiv zu sehen, wie gut die diesmal generierte Überschrift ist **. Ich habe beschlossen, es nachzuschlagen **.

Schritt 6: Überprüfen Sie die Vollständigkeit der Überschrift, die mit der API zur Ähnlichkeitsberechnung generiert wurde

Sie können die Vollständigkeit der generierten Überschriften auch mithilfe der COTOHA-API überprüfen. ** Ähnlichkeitsberechnungs-API **. Mit dieser API können Sie ** die semantische Ähnlichkeit zwischen zwei Sätzen berechnen **. Die Ähnlichkeit wird im Definitionsbereich von 0 bis 1 ausgegeben, und je näher sie an 1 liegt, desto größer ist die Ähnlichkeit zwischen Texten.

Die Überschrift "Bill Gates hat sich als MS-Direktor zurückgezogen" ist dem Artikel beigefügt. Ich habe versucht, die Ähnlichkeit der generierten Überschrift "Vorsitzender aus der Leitung zurückgezogen" zu berechnen.

{
  "result": {
    "score": 0.9716939
  },
  "status": 0,
  "message": "OK"
}

Oh, ist nicht 0,97 ziemlich teuer ...! ?? (Verwirrt Wenn COTOHA es sagt. ..

Bonus

Als Referenz habe ich auch andere Artikel ausprobiert.

Revolution im Supermarkt "Lentin"

Der Artikel hat insgesamt 4 Seiten, aber vorerst habe ich ihn nur auf der 1. Seite ausprobiert. https://news.yahoo.co.jp/pickup/6353834

● Ein extrahierter Satz
Jetzt fällt es als Produkt auf, das die Kinnrevolution in dem Sortiment symbolisiert, das in der Convenience-Store-Branche voranschreitet.
● Extrahierte Schlüsselwörter
['Symbol', 'Aufmerksamkeit', 'Reichweite', 'Convenience-Industrie', 'Kinnrevolution']

** ● Generierte Überschrift **

Im symbolischen Aufmerksamkeitsbereich(Ähnlichkeit: 0.45899978)

Selbst wenn Sie sich die Überschrift ansehen, ist es ein Chaos ... Die Ähnlichkeit ist auch sehr gering. Immerhin werden die extrahierten Schlüsselwörter ** in absteigender Reihenfolge der Punktzahl angehängt, um einen Satz ** zu bilden Ich denke es sieht so aus. Möglicherweise haben Sie zum ersten Mal gewusst, dass Chin im Bereich als ** Lentin ** abgekürzt wird. Oder besser gesagt, was ist die Kinnrevolution?

Das Spiel dauert 60 Minuten pro Tag und 80% zugunsten des Plans

Dies ist ein Artikel über Spielregeln in der Präfektur Kagawa, der umstritten ist. https://news.yahoo.co.jp/pickup/6353894

● Ein extrahierter Satz
Eine Maßnahmenverordnung für "Spielabhängigkeit", die die Präfekturversammlung von Kagawa im April durchsetzen will.
● Extrahierte Schlüsselwörter
['Verordnung über Gegenmaßnahmen', 'Versammlung der Präfektur Kagawa', 'Durchsetzung', 'Spielabhängigkeit']

** ● Generierte Überschrift **

Maßnahmen Verordnung Durchsetzung der Präfekturversammlung der Präfektur Kagawa(Ähnlichkeit: 0.2842004)

Wenn Sie sich die Überschrift ansehen, ist es schwer, aus dem Beispielspiel in der Präfektur Kagawa zu erkennen, aber was ich in diesem Artikel vermitteln möchte, sind wahrscheinlich ** 80% der Unterstützer **. Der Ähnlichkeitsgrad ist ebenfalls sehr gering. Der extrahierte Satz und die generierte Überschrift enthielten jedoch keine numerischen Informationen. Obwohl der Artikel einen bestimmten Wert von 84% enthält, wird er in der Überschrift in einen leicht verständlichen Ausdruck von 80% konvertiert. Es ist einfacher, ein Gefühl dafür zu bekommen, wenn Sie es grob sagen, als wenn Sie es im Detail sagen. Ist dieser Bereich eine für Menschen einzigartige Fähigkeit?

Schneefall in Tokio

Der gestrige Artikel. Es scheint, dass es in Tokio geschneit hat. Es sind immer noch kalte Tage ... https://news.yahoo.co.jp/pickup/6354091

● Ein extrahierter Satz
Im Zentrum von Tokio, das mehr als 10 ° C niedriger ist als gestern Mittag, ist die Temperatur nach Einhaltung der Höchsttemperatur von 12,3 ° C nach Mitternacht am 14. stetig gesunken und beträgt nun um 14:00 Uhr 2,5 ° C.
● Extrahierte Schlüsselwörter
['Beobachtung', 'Temperatur', '12 .3 ° c ',' 2.5 ° c ', '10 ° c oder mehr']
● Extrahierte Standortinformationen
['Shin Tokyo']

** ● Generierte Überschrift **

Beobachtete Temperatur im Zentrum von Tokio(Ähnlichkeit: 0.99335754)

Obwohl es sich um einen Fall handelt, der Standortinformationen enthält, werden im Zentrum von Tokio bis zu 4 Zeichen verwendet, und die Menge der erstellten Informationen ist nicht sehr groß. Ich habe das Gefühl, dass die extrahierten Schlüsselwörter auch zu viele numerische Informationen enthalten. Die Ähnlichkeit ist jedoch mit 0,99 extrem hoch ...

Zusammenfassung

Es mag ein wenig subtil erscheinen, wenn die diesmal generierte Überschrift als großer Erfolg bezeichnet wird, aber es hat Spaß gemacht, dies zu tun. Als ich die Zusammenfassung untersuchte, schien es zunächst ungefähr die folgenden Klassifikationen zu geben.

Die diesmal von COTOHA verwendete zusammenfassende API ist der frühere ** Extraktionstyp **.

Wie in Yahoo! News ist es jedoch schwierig, eine Zusammenfassung nur mit dem Extraktionstyp zu erstellen, wenn Sie versuchen, eine Zusammenfassung unter verschiedenen Regeln und Einschränkungen zu erstellen. Kombinieren Sie sie daher mit anderen Diensten ** oder dem letzteren ** abstrakten Typ Ich hielt es für notwendig, den Zusammenfassungsdienst ** zu nutzen.

Um die Anzahl der Zeichen zu verringern, scheint es leicht zu sein, sie wegzulassen, da es einige Regeln für Ländernamen usw. gibt. In diesem Bereich wird das Kinn jedoch als Lentin abgekürzt und 84% werden auf leicht verständliche Weise als 80% ausgedrückt. Ich habe das Gefühl, dass die Hürden immer noch hoch sind, selbst wenn ich Technologie zur Verarbeitung natürlicher Sprache verwende.

Ich hatte das Gefühl, dass der Tag, an dem die Überschriftengenerierung von Yahoo! News (geschickte Technik) durch KI ersetzt werden würde, vorerst nicht kommen würde.

schließlich

Ich persönlich liebe die Verarbeitung natürlicher Sprache, weil sie interessant ist.

Bitte PS4. Der folgende Qiita-Artikel ist sehr hilfreich für die Zusammenfassung der Referenzseite. - Satzzusammenfassung für die Ära der natürlichen Sprache (Qiita) [Referenz] Quellcode

Es kann viele Streifzüge geben, aber wenn Sie interessiert sind, lesen Sie bitte </ summary>

import requests
import pprint
import json
import re
from bs4 import BeautifulSoup

base_url = 'https://api.ce-cotoha.com/api/dev/nlp/'


'''
Holen Sie sich das Zugriffstoken für die COTOHA-API
'''
def get_access_token():
    url = 'https://api.ce-cotoha.com/v1/oauth/accesstokens'

    req_data = {
      'grantType' : 'client_credentials',
      'clientId' : 'Kunden ID',
      'clientSecret' : 'Kundengeheimnis'
    }

    headers = {
        'Content-Type' : 'application/json'
    }

    response = requests.post(url, json.dumps(req_data), headers=headers)
    token = response.json()['access_token']
    
    return token


'''
Rufen Sie die Zusammenfassungs-API auf
'''
def get_summary(token, document) :
    url = base_url + '/beta/summary'

    req_data = {
        'document' : document,
        'sent_len' : '1'
    }

    headers = {
        'Content-Type' : 'application/json;charset=UTF-8',
        'Authorization' : 'Bearer {}'.format(token)
    }

    response = requests.post(url, json.dumps(req_data), headers=headers)
    summary = response.json()['result']
    
    return summary


'''
Rufen Sie die Keyword-Extraktions-API auf
'''
def get_keywords(token, document):
    url = base_url + '/v1/keyword'

    req_data = {
        'document' : document,
        'type' : 'default',
        'do_segment' : True
    }

    headers = {
        'Content-Type' : 'application/json;charset=UTF-8',
        'Authorization' : 'Bearer {}'.format(token)
    }

    response = requests.post(url, json.dumps(req_data), headers=headers)
    keywords = [item.get('form') for item in response.json()['result']]
    
    return keywords


'''
Rufen Sie die API zur Extraktion eindeutiger Ausdrücke auf, um Informationen zum Speicherort zu erhalten
'''
def get_ne_loc(token,sentence):
    url = base_url + '/v1/ne'

    req_data = {
        'sentence' : sentence
    }

    headers = {
        'Content-Type' : 'application/json;charset=UTF-8',
        'Authorization' : 'Bearer {}'.format(token)
    }
    
    response = requests.post(url, json.dumps(req_data), headers=headers)
    ne = response.json()['result']
    
    ne_loc = []
    for item in ne:
        if item['class'] == 'LOC':
            ne_loc.append(item['form'])
    
    #Es gibt Fälle, in denen Duplikate auftreten, wenn nur Wörter verwendet werden
    if ne_loc:
        ne_loc = list(set(ne_loc))
        
    return ne_loc

    
'''
Rufen Sie die Syntax-Parsing-API auf
'''
def parse_doc(token, sentence) :
    url = base_url + '/v1/parse'

    req_data = {
        'sentence':sentence
    }

    headers = {
        'Content-Type' : 'application/json;charset=UTF-8',
        'Authorization' : 'Bearer {}'.format(token)
    }
    
    response = requests.post(url, json.dumps(req_data), headers=headers)
    parsed_result = response.json()['result']
    
    tokens = []
    for tokens_ary in parsed_result:
        for token in tokens_ary['tokens']:
            if token:
                tokens.append(token)
        
    return tokens


'''
Rufen Sie die API zur Ähnlichkeitsberechnung auf
'''
def get_similarity(token, doc1, doc2):
    url = base_url + '/v1/similarity'

    req_data = {
        's1' : doc1,
        's2' : doc2,
        'type' : 'kuzure'
    }

    headers = {
        'Content-Type' : 'application/json;charset=UTF-8',
        'Authorization' : 'Bearer {}'.format(token)
    }
    
    response = requests.post(url, json.dumps(req_data), headers=headers)
    similarity = response.json()['result']
        
    return similarity       


'''
Yahoo!Extrahieren Sie Inhalte aus der URL des Nachrichtenartikels
(Unterstützt nur eine einzelne Seite, unterstützt nicht mehrere Seiten oder bestimmte Artikelformate...)
'''
def get_contents(url):
    top_page = requests.get(url) 
    soup = BeautifulSoup(top_page.text, 'lxml')
    article_url = soup.find('div',class_=re.compile('pickupMain_articleInfo')).find('a').get('href')
    article_page = requests.get(article_url) 
    soup = BeautifulSoup(article_page.text, "lxml")
    for tag in soup.find_all('p',{'class':'photoOffer'}):
        tag.decompose()
    for tag in soup.find_all('a'):
        tag.decompose()
    contents =  re.sub('\n|\u3000','',soup.find('div',class_=re.compile('articleMain')).getText());
    
    return contents


'''
Yahoo!Extrahieren Sie den Titel aus der URL des Nachrichtenartikels
(Dies ist die richtige Antwort)
'''
def get_title(url):
    top_page = requests.get(url) 
    soup = BeautifulSoup(top_page.text, "lxml")
    title = soup.find("title").getText().split(' - ')[0]
    
    return title


'''
Yahoo!Generieren Sie Themen für Nachrichtenartikel
'''
def create_news_topic(token, contents):
    #Artikelzusammenfassung implementiert
    summary = get_summary(token, contents)
    print(summary)
    print("------------")
    
    #Wenn die Zusammenfassung maximal 13 Zeichen umfasst, geben Sie sie als Thema zurück
    if len(summary) <= 13:
        return summary[:-1]

    #Extrahieren Sie Schlüsselwörter und Ortsnamen aus der Zusammenfassung
    keywords = get_keywords(token, summary)
    print(keywords)
    print("------------")
    ne_loc = get_ne_loc(token, summary)
    print(ne_loc)
    print("------------") 

    topic = ''
    #Zur Überschrift hinzufügen, wenn Standortinformationen vorhanden sind
    #Auch wenn es mehrere gibt, vorerst nur die erste
    if ne_loc:
        topic += ne_loc[0] + 'damit'
        #Entfernen Sie, wenn es auch im Schlüsselwort enthalten ist
        if ne_loc[0] in keywords:
            keywords.remove(ne_loc[0])

    #Analysieren Sie das Abstract syntaktisch
    tokens = parse_doc(token, summary)

    #Erstellen Sie eine Zusammenfassung, während Sie die Keyword-Assistenten abrufen
    for keyword in keywords:
        for token in tokens:
            if token['form'] == keyword:
                print(token)
                for dependency_label in token['dependency_labels']:
                    if dependency_label['label'] == 'case':
                        keyword += tokens[int(dependency_label['token_id'])]['form']
                        break
                break
    
        if len(topic) + len(keyword) <= 13:
            topic += keyword
        else:
            return topic

    return topic


'''
Maine
'''
if __name__ == '__main__':
    #Yahoo möchten Sie Überschriften generieren!URL des Nachrichtenartikels
    url = 'https://news.yahoo.co.jp/pickup/6354056'   

    #Artikelinhalt und Titel extrahieren
    contents = get_contents(url)
    title = get_title(url)
    print("------------")
    print(contents)
    print("------------")
    print(title)
    print("------------")    
    
    #Holen Sie sich ein Token für die COTOHA-API
    token = get_access_token()
    
    #Artikelüberschriften generieren
    topic = create_news_topic(token, contents)
    print(topic)
    print("------------") 
    
    #Berechnen Sie die Ähnlichkeit zwischen der ursprünglichen Überschrift und der generierten Überschrift
    similarity = get_similarity(token, title, topic)['score']
    print(similarity)
    print("------------") 

Recommended Posts

Fordern Sie heraus, Yahoo! News-Überschriften nur mit der COTOHA-API zu generieren
Massenposting an Qiita: Team mit Qiita API
Generieren Sie API-Spezifikationen mit GO / Gin Gin-Swagger
Ich habe versucht, die COTOHA-API zu berühren
Spielen Sie mit Dajare mithilfe der COTOHA-API
Lassen Sie die COTOHA-API die schwierigen Dinge tun - Einführung in das "Lernen mit" der Verarbeitung natürlicher Sprache -