단어정리

기존의 ‘형태소 사전’에서 다운받아 단어를 추려 사용하였다. 사용된 단어들의 범주가 중구난방이여서 대부분의 사람들에게 어렵게 느껴질 수 있고, 추리는 입장인 나도 애매한 단어가 너무 많이 보였다. 그래서 현대인들이 자주 쓰는 단어를 사용하기 위해, 국립국어원의 사전 중 ‘한국어기초사전’과 ‘우리말샘’을 이용하여 단어 파일을 만들었다. 먼저 ‘우리말샘’과 ‘한국어기초사전’에서 전문성이 없는 3~4음절 단어를 다운로드 받고, 다운로드 받은 단어들을 파일로 만들기 위해 어려운 단어나, 잘 쓰이지 않는 단어를 추려내야 할 필요가 있었다.


1.단어 추리기

단어를 먼저 추리기 위해 크롤링을 통해 단어의 뜻이 모호하거나, 자주 쓰이지 않고 어려운 단어를 추렸다.
약 100,000개의 단어를 주관적인 의견을 담아 단어를 추렸다. 단어를 추릴 때는 직접 단어 하나하나 확인하였다.

2.단어 뜻 확인하기

단어 중에서도 간혹 뜻이 없는 단어가 있었다. 우리말 샘에 검색하면, 단어는 나오는데 뜻이 없는 경우이다. 이럴 때 사전에서 검색할 때 사용자에게 불편함을 줄 수 있기에 단어를 삭제하였다. 아마 파생단어이기에 뜻이 없거나, 링크를 이용해 연결된 부분이었던 것 같다. 여기서 크롤링을 사용하게 되었다.

3.크롤링

1) Library 설치(VScode)

먼저 VScode에서 c# 크롤링을 사용하려면 아래의 Library가 필요하다.

  • Selenium.WebDriver
  • Selenium.Support
  • Selenium.WebDriver.ChromeDriver
  • DotNetSeleniumExtras.WaitHelpers

위의 selenium Library를 설치하기 위해 VScode에서는 NuGet Manager를 설치해야 된다.

위의 사진에서 확장 아이콘을 클릭한 후에 마켓플레이스에 NuGet이라고 검색하면, 다양한 패키지들이 나온다. 여기서 Nuget Package Manager을 설치해 준다. 이후에 ctrl+shift+p를 누르면 위쪽에 방금 설치한 Nuget Package Manager가 있을 것이다. 눌러서 위의 4개의 Library를 프로젝트에 Install 해주면 된다.

2) Code

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

string line;
bool IsElementPresent(IWebDriver _driver, By _by) //html에서 tag가 존재하는지 검색해 반환
{
	try 
	{
		_driver.FindElement(_by);
		return true;
	}
	catch(NoSuchElementException)
	{
		return false;
    }
}

using (StreamWriter wfile = new StreamWriter(@"test3.csv")) // 새로 쓰여질 CSV 파일
using (IWebDriver driver = new ChromeDriver())
{
	var file = new StreamReader(File.OpenRead(@"words4_220114.csv")); //찾을 단어 파일
	file.ReadLine(); // 한 줄 씩 읽으면서 내려간다.
	wfile.WriteLine("name,mean"); // 제일 첫째줄은 목록 이름이므로 한줄을 미리 새로쓰여질 파일에 작성
	int index = 0; 
	while((line=file.ReadLine())!=null)
	{
		driver.Url = "https://opendict.korean.go.kr/search/searchResult?query="+line+"&dicType=1&wordMatch=Y&searchType=&currentPage=1&cateCode=&fieldCode=&spCode=&divSearch=search&infoType=confirm&rowsperPage=10&sort=W"; //검색할 곳의 링크

		var options = new ChromeOptions();
		options.AddArgument("--test-type");
		options.AddArgument("--disable-extensions");
		options.AddArguments("disable-infobars");
		options.AddArguments("--disable-notifications");
		options.AddArguments("enable-automation");
		options.AddArguments("--disable-popup-blocking");
		options.AddArguments("start-maximized"); //chromedriver의 옵션

        var elements = driver.FindElements(By.CssSelector("#searchPaging dd")); 
        //id가 searchPaging이고, tag가 dd인 항목을 찾아 list에 저장
        if (IsElementPresent(driver, By.CssSelector("span.word_dis.ml5")))
        {
            string mean = elements[0].FindElement(By.CssSelector("span.word_dis.ml5")).Text;
            //class가 span.word_dis.ml5인 것이 뜻이므로 string으로 저장한다.
            //어차피 얻어야 할 것은 제일 통용되는 뜻이므로, 제일 위의 뜻을 가져옴
			wfile.WriteLine(line +","+"&"+mean+"&");
            //단어의 뜻을 새로운 파일에 저장. 이때 내용 중에 ','가 포함되므로 내용 중에 사용되지 않을 것 같은 &을 좌우에 추가하여 저장
            Console.WriteLine(index);
			index++;
        }
    }
}

위의 Code는 뜻 밖에 없는 csv 파일에 옆으로 의미 항목을 추가하는 작업이다. 위의 링크에 검색을 한 후 필요한 부분만을 가져와 사용한다.