0
0

More than 1 year has passed since last update.

WordNetのAPIをNext.jsのAPI RoutesとDynamic Routesでかきかきする話

Posted at

Hello world.

Hello world. 世界よこんにちはってわけですね。エンジニアの皆さんは一度は聞いたことがあるはず。(ちなみに私は中2)
今回は、ごく少ない需要(皆無)に応えるためWordNetから類義語(いわゆる、"Synonyms")が生成できるAPIをNext.jsのAPI Routesを使って作ったわけです。
なぜか知りませんが、WordNetは大体Pythonで扱うのが主流なようで、まあそれなりに記事が少ないわけです。
というか膨大なワードデータを生成できるAPIを作ってしまったらリソースが爆発しちゃうから、Next.jsでしかもAPI Routeだなんていう浅はかな考えをする人は私ぐらいしかいないわけですので、多少メモっぽく書きます。

環境構築

みんな大好き(私は嫌い)環境構築のお時間。
TypeScriptのNext.jsを使っている前提で、naturalというモジュールを入れます。

npm i natural

Code

このコードを、コメントアウトにも書いてありますが、Next.jsのAPIディレクトリ(大体pages/api)の中にsynonymsディレクトリを作り、それをさらにDynamic Routesで配置するわけです。pages/api/synonyms/word.tsの中身がこれ↓

// Next.js API route files must be inside the pages/api directory.
// In this case, create a file at pages/api/synonyms/[word].ts

import { NextApiRequest, NextApiResponse } from 'next';
import natural from 'natural';
const wordnet = new natural.WordNet();

const handleRequest = async (req: NextApiRequest, res: NextApiResponse) => {
  if (req.method === 'GET') {
    const { word } = req.query;

    wordnet.lookup(word as string, function(details: any) {
      let synonyms = details.map(function(detail: any) {
        return detail.synonyms;
      }).flat();

      synonyms = Array.from(new Set(synonyms)); // remove duplicates
      synonyms = synonyms.filter((synonym: string) => synonym !== word);

      res.status(200).json({word: word, synonyms: synonyms});
    });
  } else {
    res.setHeader("Allow", ["GET"]);
    res.status(405).end(`Method ${req.method} Not Allowed`);
  }
};

export default handleRequest;

TypeScriptの書き方に慣れてないので汚いわけなんですが、
動くのでよしとしましょう。naturalというモジュールが非常に便利で、WordNetだったり諸々が簡単に扱えるわけです。他にも似たようなものはあるのですが、書き方が自分的に自然だったのでこれを選びました。
応答は権利的に公開していいものなのかわからないので、自分で試してみてね。
くれぐれもリソースが爆発しないように、実行は自己責任でお願いします!

おわり

0
0
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
0
0