7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Web APIAdvent Calendar 2021

Day 22

QiitaAPIをつかっていろんな記事の誤字を探す

Last updated at Posted at 2021-12-21

モチベーション

  • 2021年の夏ごろからContributionの計算式が変わった
  • 「編集リクエストが承諾される」と、Contribution が 5 増えるようになった
    • =太っ腹になった(従来でいうと、LGTM50の記事に送ったリクエストが採用されることに等しい)
  • 編集リクエストを出しまくれば Contribution を爆上げできるのではないか?
    • ゲームみたいでおもしろそう

以上、モチベーション

(追記)2022年4月1日から計算式が変わりました!!

5から1へ格下げになりました😭
GitHubのディスカッションにいろいろ意見があります

今後も計算式が変わることが予想されますので、最新の情報をあたってください

編集リクエストが採用されるには

記事から誤字脱字を見つけて、修正リクエストを出すことが近道だと思う

もう1つ重要なのが、その記事の著者が Qiita を継続して使用していること

せっかくリクエストを出しても、Qiita から zenn にお引っ越しされてたら、リクエストは永遠に承諾されないので。

Typo

私はTypoの修正も立派な貢献だと思っています。

誤字の修正も立派な貢献だと自分に言い聞かせる

【本題】記事から誤字を探す

  • C# .NET 6.0 コンソールアプリケーション
  • Qiita API v2

Qiita を継続して使用しているユーザーとは

Qiita トップページのトレンドに記事が載っているユーザーは、Qiita を継続して使用していると仮定する

つまり、トレンドに載っている記事を書いたユーザーはリクエストを承諾してくれる可能性が高い
せっかくなのでユーザーが過去に書いた記事もあわせて誤字探索する

トレンド記事を書いたユーザー一覧を取得する

XMLフィードを解析してユーザー(author)一覧を取得する

// トレンド記事の一覧を取得する
using var client = new HttpClient();
XNamespace xNamespace = @"http://www.w3.org/2005/Atom";
var feed = XDocument.Load(@"https://qiita.com/popular-items/feed");
var entries = feed.Element(xNamespace + "feed").Elements(xNamespace + "entry");

// 各記事の著者名を string 型で取得する(APIクエリで使用)
List<string> authorList = new ();
foreach (var entry in entries)
{
    string author = entry.Element(xNamespace + "author").Value;
    authorList.Add(author);
}

ユーザー一覧を取得した結果

左)Qiita トレンドのスクリーンショット
右)上記プログラムで取得したユーザーのリスト

image.png

ユーザーが書いた記事の一覧を取得する

Qiita APIをつかって記事を取得する

"投稿"セクションをみると、指定されたユーザーの記事一覧を、作成日時の降順で返してくれる

レスポンスの JSON に含まれるすべてのキーを使う必要はないので、要るものだけ選別してデータクラスをつくる

public class Response
{
    public string url { get; set; }
    public string title { get; set; }
    public string body { get; set; }
}

このクラスのプロパティ名が JSON のキーに対応するので、先頭は大文字にしない

APIの仕様(↓)通りに GET リクエストを送信して、レスポンスである記事一覧itemsを取得する

GET /api/v2/users/:user_id/items

var response = await client.GetStreamAsync(@"https://qiita.com/api/v2/users/" + author + "/items");
var items = JsonSerializer.Deserialize<Response[]>(response);

記事から誤字を探す

「トレンドに載っているユーザー数 × 各ユーザーが過去に書いた記事」の記事に対して、誤字をみつける

なにをもって誤字とするかは難しいところなので、誤字の辞書はあとで改善する
今回はお試しで、「てて」「にに」「をを」「はは」が誤字であると仮定する

foreach (var item in items)
{
    var judge1 = item.body.Contains("てて");
    var judge2 = item.body.Contains("にに");
    var judge3 = item.body.Contains("をを");
    var judge4 = item.body.Contains("はは");

    if (judge1 || judge2 || judge3 || judge4)
    {
        Console.WriteLine("誤字がありました!");
    }
}

API利用制限

認証している状態ではユーザーごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までリクエストを受け付けます。

トレンドに表示されるユーザーは 30 なので、認証がなくともすべてのユーザーの記事を取得できる

結果

  • 「をを」は高確率で誤字
  • 「にに」「はは」もまあまあ誤字
  • 「てて」は誤字ではないことが大半

image.png

おわりに

本気で Contribution を爆上げしたいのであれば、これだけじゃ足りない

時間みつけて以下を試す

  • もっと誤字の辞書を豊富にする
  • 目視で結果を確認したあと、ワンクリックでリクエストを送信する仕組み

GitHubの誤字コーパスがあるので、ちょっと調べてみる

参考リンク

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?