エビフライの唐揚げ

今までのことや、技術的なこと、その他を書いていこうと思います。

文章の自動カテゴリ分類について

WiredBookStore ネット書房で使用した文章のカテゴリ分類について説明します

 

一度、機械学習(確かfasttext?)を用いてカテゴリ分類を行おうとしたのですが、精度があまり良くなく、独自の方法でカテゴリ分類を行いました。

 

内容は至って簡単です。

1.Googleでニュースと調べる

 するとニュースサイトの一覧が出てきます。

2.サイト一覧のhtmlから文章を抽出して形態素解析を行い

 名詞の出現頻度を調べCSVにまとめます。

3.実際カテゴリ分類したいサイトの文章とカテゴリ毎の単語の出現頻度を比較し

 一番出現頻度の高いカテゴリに分類するということです

 

流れとしては下記の通り

f:id:littlemore:20200525165655p:plain

 

実際作ったCSVの一部を公開します

f:id:littlemore:20200525170249p:plain

 

上の例を見ていただければ分かると思いますが

「ニュース、政治、国際情勢」というカテゴリで一番出現回数の多い単語が「環境」になり次に多いのが「事業」になります。

 

ソースコード置いておきます。

_countWordDatasにcsvの中身が入っていて

引数で渡しているstringの配列は、分類対象の文章を形態素解析したあとの名詞の配列です。

/// <summary>
/// ファイルロードしたカテゴリーデータで分類を行います
/// </summary>
/// <param name="keywords"></param>
/// <returns></returns>
public Dictionary<string, double> Judge(string[] keywords)
{
	var result = new Dictionary<string, double>();

	foreach (var word in keywords)
	{
		IEnumerable<CountWordData> countWordDatas = new List<CountWordData>();

		countWordDatas = _countWordDatas.Where(p => p.Word == word).ToList();

		foreach (var countWordData in countWordDatas)
		{

			if (result.ContainsKey(countWordData.Category) == false)
			{
				result[countWordData.Category] = countWordData.Vec;
			}
			else
			{
				result[countWordData.Category] += countWordData.Vec;
			}
		}
	}

	//カテゴリー補正
	//キーワードにカテゴリー名が含まれていた場合、対象カテゴリーの値を1.5倍
	foreach (var key in result.Keys.ToArray())
	{
		if (keywords.Where(p => key.Contains(p)).Count() > 0)
		{
			result[key] = result[key] * 1.5;

			//if(key.Contains("ニュース"))
			//	result[key] = result[key] * 1.5;
		}
			
	}

	return result;
}

これを使って自動分類を行いました。