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

## モチベーション

- 2021年の夏ごろから[Contributionの計算式が変わった](https://blog.qiita.com/add-items-for-calculating-contribution/)
- 「編集リクエストが承諾される」と、**Contribution が 5 増える**ようになった
  - ＝太っ腹になった（従来でいうと、LGTM50の記事に送ったリクエストが採用されることに等しい）
- **編集リクエストを出しまくれば Contribution を爆上げできるのではないか？**
  - ゲームみたいでおもしろそう

以上、モチベーション

### （追記）2022年4月1日から計算式が変わりました！！

**5**から**1**へ格下げになりました😭
[GitHubのディスカッション](https://github.com/increments/qiita-discussions/discussions/164)にいろいろ意見があります

https://blog.qiita.com/change-contribution-calculation-20220401/

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

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

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

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

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

#### Typo

https://qiita.com/ryo2132/items/0ea06e93ac26f2c83736

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

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

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

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

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

[Qiita トップページのトレンド](https://qiita.com/popular-items)に記事が載っているユーザーは、Qiita を継続して使用していると仮定する

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

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

[XMLフィード](https://qiita.com/popular-items/feed)を解析してユーザー（author）一覧を取得する

```csharp
// トレンド記事の一覧を取得する
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/7b959cdc-1b24-7b86-4634-9e7fab74d78a.png)

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

[Qiita API](https://qiita.com/api/v2/docs)をつかって記事を取得する

"投稿"セクションをみると、[指定されたユーザーの記事一覧を、作成日時の降順で返してくれる](https://qiita.com/api/v2/docs#get-apiv2usersuser_iditems)

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

```csharp
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`）

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

### 記事から誤字を探す

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

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

```csharp
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/899f69d1-6906-30fc-d18a-3410b505ef31.png)

## おわりに

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

時間みつけて以下を試す

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

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

https://github.com/mhagiwara/github-typo-corpus

## 参考リンク

https://usagi.hatenablog.jp/entry/2019/03/19/230115