─━ IT ━─

Java Mail과 Classifier4j에서 인텔리전트한 전자 메일 필터를 작성하다

DKel 2021. 8. 16. 00:45
반응형
처음에 스팸 필터 제품을 쓰다가 기능상의 한계나 오판정(false positive)에 시달린 적은 없을까.Classifier 4J는 전자 메일이나 각종 텍스트 문서를 읽고 필요한 것만을 정확하게 선별하는 커스텀 어플리케이션을 작성하기 위한 오픈 소스 Java 라이브러리이다.인텔리전트 필터란 나날의 생활이 정보로 가득 차 전자 메일 클라이언트의 수신 박스가 흩어지기 시작하면, 그러한 정보를 효율적으로 읽어, 선별, 처리하는 것이 수작업에서는 어려워진다.애당초 그런 일에 쓸 시간은 없는 것이다.여러 사람과 기업이 노력하고 있음에도 불구하고, 이 상황은 전혀 개선되지 않았다.오히려 나빠지기만 한다.이러한 문제의 대책의 하나로서 인텔리전트 필터의 도입이 있다.인텔리전트 필터는 특정 키워드를 찾을 뿐만 아니라 텍스트의 의미도 판별하려고 한다.즉, 전자 메일의 텍스트를 읽어 정의를 마친 일련의 파라메타를 기본으로, 그 내용이 유저에게 필요한 정보인지 아닌지를 통계적으로 판단하는 것이다.최근의 스팸 필터 중에는 이 기능이 있어 사용자가 그 메일이 스팸인지 아닌지를 선별할 때마다 학습해 나간다.이러한 툴이 시간이 지남에 따라 지혜로워지지만 그래도 실수가 완전히 없어지는 것은 아니다.예를 들어 흔히 볼 수 있는 것이 오판정 문제다.Classifier 4J와 Java Mail API를 사용한 전자 메일 클라이언트 Classifier 4J는 텍스트 분류 처리를 실시하기 위한 오픈 소스 Java 라이브러리이다(Source forge로부터 입수 가능).이 라이브러리는 「베이지안 분류법」을 실장하고 있다.베이지안 분류법이란 특정 가설이 성립될 개연성을 베이즈 정리에 기초해 계산하는 통계 기법이다 (적절한 구현의 개요에 대해서는 http://www.paulgraham.com/better.html을 참조). 이것은 통상적 텍스트의 내용이 특정 주제에 부합하는지 여부를 평가하는 데 사용되고 대표적인 사용 예는 전자 메일이 스팸 여부를 판별하는 것이다. 이 글에서는 JavaMail API을 사용하여 매우 뛰어난 기능을 갖는 단순한 POP3클라이언트를 작성한다. 이를 응용하고, IMAP, POP3, SMTP를 사용한 독자적인 메일 애플리케이션을 개발할 수 있다(JavaMail에 대한 자세한 내용은 Sun의 문서를 참조). 이 POP3클라이언트를 POP3상자에서 전자 메일을 꺼내어, Classifier4J라이브러리를 통해서 내용의 분류, 스팸 판정, 또 내용의 자동 예약을 하도록 한다. 우선은 JavaMail API을 입수하고 사용할 수 있는 상태다.JavaMail은 Sun에서 구할 수 있다(본고의 소스 코드에서는 버전 1.3.1을 사용). 게다가 JavaMail에 종속되는 JavaBeans Activation Framework(JAF)도 필요하다.전자 메일 클라이언트의 작성 상기 패키지를 내려받아 설치하면 다음은 전자 메일 클라이언트를 작성한다.여기에서는 POP3전자 메일 계정과 그 계정에 관련하는 유저명, 로그인 서버 이름의 정보가 필요하다.여기서 작성하는 것은 매우 단순한 콘솔 응용 프로그램이지만 필요하다면 나중에 더 복잡할 수 있다.여기서 흥미 부서 돌아가는 것은 이를 서블릿 기반의 애플리케이션에 짜넣으면, 스팸 필터로 분류 기능을 갖추었다또한 Hotmail 이나 Yahoo! 와 같은 호스팅형 이메일 클라이언트를 구현할 수 있어야 한다. 이 어플리케이션의 코드는 다음과 같다. package com.devx.jmail;
import javax . mail . * ;
import javax . mail . internet . * ;
import java . util . * ;
import java.io . * ;
import net . sf . classifier 4J . * ;
public class MailReader
{
public static void main ( String [ ] args )
{
try
{
String popServer = ′ yourpopserveraddress ′ ;
String popUser = ′ yourpopusername ′ ;
String popPassword = ′ yourpoppassword ′ ;
GetMail ( popServer , popUser , popPassword ) ;
}
catch ( Exception e )
{
e . printStackTrace ( ) ;
}
System . exit ( 0 ) ;
}} 어플리케이션이 정상적으로 동작하기 위해서는 pop Server, pop User, pop Password에는 POP3 계정의 올바른 값을 할당해야 한다.보다시피, 이것은 극히 단순한 콘솔 애플리케이션으로, 대단한 처리는(현시점에서는) 행하고 있지 않다.실제 처리를 맡고 있는 것은 GetMail 함수이다.메일의 취득 JavaMail API는 매우 큰 라이브러리이므로 여기에서 상세한 내용을 해설할 수 없다.여기서 소개하는 예에서는 가장 단순한 처리만 해 본다.즉, 로그인, 수신 박스내의 메일의 스캔, 수신 박스내의 메일의 복제 다운로드이다.여기에서는 이 함수의 핵심이 되는 부분을 소개한다.Get Mail 함수의 완전한 코드는 Java Mail 다운로드 파일을 참조. store.connect(pop Server, pop User, pop Password);
folder = store . getDefaultFolder ( ) ;
if ( folder == null ) throw new Exception ( ′ No default folder ′ ) ;
folder = folder . getFolder ( ′ INBOX ′ ) ;
if ( folder == null ) throw new Exception ( ′ No POP 3 INBOX ′ ) ;
folder . open ( Folder . READ _ ONLY ) ;
Message [ ] msgs = folder . getMessages ( ) ;
for ( int nMsg = 0 ; nMsg < msgs . length ; nMsg ++ )
{
strEmail = buildMessage ( msgs [ nMsg ] ) ;
} Java Mail의 store 객체를 셋업하면 Server Name, User Name, Password 파라미터를 사용하여 store 객체에 접속한다.접속이 성공하고 예외가 반환되지 않았을 경우(상기 코드는 try..catch 구내에 적을 필요가 있다), store 오브젝트와 관련되어 있는 디폴트 폴더를 취득한다.기본 폴더가 없을 경우 예외가 반환된다.각각의 POP3 어카운트에는, 착신 메일을 격납하기 위한 INBOX 폴더가 있다.이 폴더가 존재할 경우 폴더를 열고 거기에서 Message 객체의 배열을 읽어낸다.이것은 현재의 수신 박스내의 전 메일의 일람이다.INBOX 폴더는 읽기 전용(READ_ONLY)으로서 열려 있으므로, 메일을 읽어도, 그 수신 박스로부터 메일이 삭제될 것은 없다.이후 모든 Message 객체를 루프 처리하고 build Message 함수를 사용하여 각 Message의 문자열을 생성한다.build Message 함수의 완전한 코드에 대해서는 Java Mail 다운로드 파일을 참조하기 바란다.여기에서는 이 함수의 핵심이 되는 부분을 소개한다.InputStream is = messagePart . getInputStream ( ) ;
BufferedReader reader = new BufferedReader ( new InputStreamReader ( is )) ;
String thisLine = reader . readLine ( ) ;
while ( thisLine ! = null )
{
strReturn + = thisLine ;
thisLine = reader . readLine ( ) ;
}POP3의 전자 메일 메시지는 송신자명, 송신자 주소, 건명, 본문 등, 몇 개의 주체로 이루어진다.또한 본문은 몇개의 파트로 나누어져 첨부 파일을 포함하고 있기도 하다.build Message 함수는 이들 엔티티를 모두 받고 하나의 문자열에 연결하여 호출원으로 돌려 보낸다.전자메일 메시지의 다양한 부품 중에서 이번 샘플에서 중요한 것은 본문 부분이다.본문은 일반적으로 복수의 텍스트 행으로 이루어지므로, messagePart 객체(e메일 본래부터 작성되는 객체, 자세한 것은 함수의 완전한 코드를 참조)는 본문을 1줄씩 읽기 위해 사용되는 InputStream을 공개하고 있다.이것을 사용하여 Buffered Reader를 작성하고, 그 Buffered Reader가 이메일의 본문을 읽어낸다.이로써 이번 샘플에서 사용하는 단순한 e메일 클라이언트가 완성됐다.이 클라이언트의 기능은, POP3 박스에 로그인해, 수신 박스로부터 메일을 취득해, 메일을 1개씩 다운로드해, 그것을 Classifier 4J로 분류·요약하기 위한 문자열로 변환하는 것뿐이다.단순한 텍스트 분류 Classifier 4J 에는, 텍스트 분류를 위한 라이브러리가 많이 포함되어 있다.우선 단순한 조회를 실시하는 Simple Classifier에 대해 살펴보자.다음 코드는 Simple Classifier를 사용하여 스팸 메일 여부의 개연성 점수를 설정하는 방법을 보여주고 있다.이 예에서는 스팸 여부를 단순히 ′Belgium′이라는 단어의 유무에 근거하여 판단하고 있다(′Hitch Hikers Guide to the Galaxy′를 좋아하는 사람이라면 이 단어를 선택한 이유를 알 수 있을 것이다.자세한 설명에 대해서는, 이 페이지를 참조).공용 정적 이중 검사스팸(StringstrEmailBody)

{
double dClassification = 0.0;
노력하다
{
SimpleClassifier 분류자 = 새 SimpleClassifier();
분류자.setSearchWord(′벨기에′);
dClassification = classifier.classification(strEmailBody);
}
catch(예외)
{
e.인쇄 스택 트레이스();
}
반환된 dClassification;
}ダウンロードしたコードを見ればわかるが、前出のgetmail関数はこの関数を呼び出している。電子メールをダウンロードして1つの文字列にまとめた後、その文字列をこの関数に渡し、スパムの蓋然性スコアを判定すより大きいもの(>0.7)をすべてスパムと見なすことにする。なお、ここでは大文字と小文字を区別している。単語「belgium」を含む電子メールのスコアは0.0で、単語「belgium」を含む電子メールのスコアは1.0になる。大文字と小文字をイジアンフィルタの使用方法である。IWords DataSource words = 새로운 SimpleWords 데이터 원본();
wds.addMatch(′벨기에′);
wds.addMatch(′보기′);
wds.addMatch(′Devx′);
IC 분류자 분류자 = 새 베이지안 분류자(wds);
dreturn = classifier.classify(stremailbody); このフィルタはまずsimplewordsdatasourceで初期化され、キーワードとなる3つの単語が設定される。ただし、この単純なサンプルは、このままではまったく役に立たない。ベイジアンてくる単語である。しかし、「millionaire(大金持ち)」という単語はスパムメール内に出てくることが多い。高機能のスパムフィルタアプリケーションは、何がスパムで何がそうでないかを絶えず学習しており、その中で「知jのベイジアンフィルタを訓練するには、ITrainableClassifier는 다음과 같이 분류됩니다. Classifier 4jのオプションディストリビューションで見ることができる(src/java/net/sf/classifier4j/demo内)。このデモは、フィルタを効果的に訓練するための入力テキストファイルの形になっており、別のファイルの妥jによる自動要約このアプリケーションでは、着信メールを分類するだけでなく、内容を要約することもできる。たとえば、受信ボックスの中身を取り出し、メールの内容を要約し、その要約を新しい電子メールにしてjで要約を行うのは非常に簡単である。必要な作業は、isummarizerからクラスを作成し、そのクラスに要約対象の文字列と要約後の文の数を渡すことだけだ。残りの処理はすべて自動的に行われ、要約された文字列が返される。次に示すのは、ダウンロードファイル内に含まれて
{
IS 요약 요약 요약 = 새로운 단순 요약();
문자열 strSum = sum.요약(strEmailBody, n문장);
return strSum;
} 今回のアプリケーションでは、isummarizerを呼び出し、それに電子メールの本文を渡し、この電子メールを3つの文に要約するよう要求したいと思う。そのためのコードは次のようになる。string strsumm = getsummary(stremail,3); このアプリケーシ
그리고 ODBC를 통해 애플리케이션이 백엔드 데이터베이스와 느슨하게 결합되었습니다.
동종 최고의 데이터베이스를 선택하고 스왑할 수 있도록 허용
사용자 인터페이스에 미치는 악영향 없이 필요할 때 꺼집니다.
마찬가지로, 데이터 및 데이터에 XML을 사용하여 HTML로 표시되는 데이터 및 프레젠테이션의 디커플링도 가능합니다.
데이터 프레젠테이션을 위한 XSLT는 많은 혁신과 유연성을 이끌어냈습니다.
그중에서도 XML에서 문서를 데이터로 전달하고 전달할 수 있는 기능이 있습니다.
다른 XSLT를 사용하여 해당 문서에 대한 사용자 지정 스타일 지정.
데스크톱에 런타임 엔진이 있고 서버가 있을 것입니다.
XML 문서를 사용하여 브라우저에 GUI를 전송할 수 있습니다.これは1001ワードのテキストを3つの文(合計115ワード)に要約したもので、なおかつ元の記事の内容をきちんと表している。なかなか見事な要約ぶりである。まとめ現代では、ますます多くの情報が受信ボックス、インスタントメッセンジャー、電話、テレビなど各種メディアに押し寄せるようになっているので、こうした情報のコンテキストを把握するための技術が今後より一層求められるようになるだろう。わかりやすい利用例はスパムフィルタだが、それ以外にも、さまざまな方法でこの機能が利用されるようになるだろう。たとえば、ニュースプロバイダからの新着ニュースを監視し、関心のある分野のニュースだけを選んで要約し、モバイルツールに転送するインテリジェントエージェントはどうだろうか。あるいは、映画のレビューを読み取り、関心のあるジャンルのレビューだけを選び、あらすじの要約を電子メールで送信するなどのアプリケーションも考えられる。可能性は無限である。classifier4jオープンソースライブラリは、このようなアプリケーションを開発するための第一歩だ。本稿で紹介したのは、classifier4jと電子メールインターフェイスを使用して実現できることのほんの一部である。残りは自分で
반응형