\file GikoBayesian.pas
\brief \83x\83C\83W\83A\83\93\83t\83B\83\8b\83^
-$Id: GikoBayesian.pas,v 1.14 2004/11/01 09:51:57 yoffy Exp $
+
+$Id: GikoBayesian.pas,v 1.22 2009/01/31 15:47:15 h677 Exp $
}
//! \95½\89¼\96¼\82ð\8e«\8f\91\82É\8aÜ\82ß\82È\82¢
for i := 1 to sl.Count - 1 do begin
s := sl[ i ];
- name := RemoveToken( s, #1 );
+ name := GikoBayesian.RemoveToken( s, #1 );
info := TWordInfo.Create;
- info.NormalWord := StrToIntDef( '$' + RemoveToken( s, #1 ), 0 );
- info.ImportantWord := StrToIntDef( '$' + RemoveToken( s, #1 ), 0 );
- info.NormalText := StrToIntDef( '$' + RemoveToken( s, #1 ), 0 );
- info.ImportantText := StrToIntDef( '$' + RemoveToken( s, #1 ), 0 );
+ info.NormalWord := StrToIntDef( '$' + GikoBayesian.RemoveToken( s, #1 ), 0 );
+ info.ImportantWord := StrToIntDef( '$' + GikoBayesian.RemoveToken( s, #1 ), 0 );
+ info.NormalText := StrToIntDef( '$' + GikoBayesian.RemoveToken( s, #1 ), 0 );
+ info.ImportantText := StrToIntDef( '$' + GikoBayesian.RemoveToken( s, #1 ), 0 );
AddObject( name, info );
end;
wKanjiDelimiter : TStringList;
words : TStringList;
aWord : string;
- countInfo : TWordCountInfo;
+// countInfo : TWordCountInfo;
function cutBoth( _aWord : string; _delim : TStringList ) : string;
var
Result := 0.01
else if info.ImportantWord + info.NormalWord * 2 < 5 then
Result := 0.5
- else
- Result := ( info.ImportantWord / info.ImportantText ) /
- ((info.NormalWord * 2 / info.NormalText ) +
- (info.ImportantWord / info.ImportantText));
+ else begin
+ try
+ Result := ( info.ImportantWord / info.ImportantText ) /
+ ((info.NormalWord * 2 / info.NormalText ) +
+ (info.ImportantWord / info.ImportantText));
+ except
+ on EZeroDivide do Result := 0.99;
+ end;
+ end;
end;
var
s := s * Single( narray[ i ] );
q := q * (1 - Single( narray[ i ] ));
end;
-
- Result := s / (s + q);
+ try
+ Result := s / (s + q);
+ except
+ Result := 0.5;
+ end;
finally
narray.Free;
end;
else if info.NormalWord = 0 then
Result := 0.99
else
+ {
Result := ( info.ImportantWord / info.ImportantText ) /
((info.NormalWord / info.NormalText ) +
(info.ImportantWord / info.ImportantText));
+ }
+ try
+ Result := (info.ImportantWord * info.NormalText) /
+ (info.NormalWord * info.ImportantText +
+ info.ImportantWord * info.NormalText);
+ except
+ Result := 0.5;
+ end;
end;
function f( cnt : Integer; n, mean : Single ) : Extended;
const
- k = 0.00001;
+ k = 0.001;
begin
Result := ( (k * mean) + (cnt * n) ) / (k + cnt);
end;
mean : Extended;
countInfo : TWordCountInfo;
i : Integer;
- P1, Q1, R1 : Extended;
+ P1, Q1{, R1} : Extended;
cnt : Extended;
begin
end;
cnt := wordCount.Count;
if cnt = 0 then
- cnt := 1
- else
- P1 := 1 - Power( P1, 1 / cnt );
- Q1 := 1 - Power( Q1, 1 / cnt );
+ cnt := 1;
+ try
+ P1 := 1 - Power( P1, 1 / cnt );
+ except
+ end;
+ try
+ Q1 := 1 - Power( Q1, 1 / cnt );
+ except
+ end;
if P1 + Q1 = 0 then begin
Result := 0.5
else if info.NormalWord = 0 then
Result := 0.99
else
- Result := info.ImportantWord /
- (info.ImportantWord + info.NormalWord *
- info.ImportantText / info.NormalText);
+ {
+ Result := ( info.ImportantWord / info.ImportantText ) /
+ ((info.NormalWord / info.NormalText ) +
+ (info.ImportantWord / info.ImportantText));
+ }
+ Result := (info.ImportantWord * info.NormalText) /
+ (info.NormalWord * info.ImportantText +
+ info.ImportantWord * info.NormalText);
end;
function f( cnt : Integer; n, mean : Single ) : Extended;
const
- k = 0.00001;
+ k = 0.001;
begin
Result := ( (k * mean) + (cnt * n) ) / (k + cnt);
end;
function prbx( x2, degree : Extended ) : Extended;
- var
- m : Extended;
- sum : Extended;
- term : Extended;
- i : extended;
begin
- m := x2 / 2;
- sum := exp( -m );
- term := -m;
-
- i := 1;
- while i < (degree / 2 - 1) do begin
- term := term + ln( m / i );
- sum := sum + exp( term );
- i := i + 1;
- end;
-
- if sum < 1 then
- Result := sum
- else
- Result := 1.0;
+ Result := 0.5;
end;
mean : Extended;
countInfo : TWordCountInfo;
i : Integer;
- normal : Extended;
- important : Extended;
+// normal : Extended;
+// important : Extended;
P1, Q1 : Extended;
cnt : Extended;
begin
end;
mean := mean / wordCount.Count;
- cnt := 0;
-(*
P1 := 1;
Q1 := 1;
-(*)
- P1 := 0;
- Q1 := 0;
-//*
for i := 0 to wordCount.Count - 1 do begin
countInfo := TWordCountInfo( wordCount.Objects[ i ] );
n := f( countInfo.WordCount, narray[ i ], mean );
- if countInfo <> nil then
- cnt := cnt + countInfo.WordCount;
-(*
- P1 := P1 + Ln( 1 - n ) * countInfo.WordCount;
- Q1 := Q1 + Ln( n ) * countInfo.WordCount;
-(*)
- P1 := P1 + Ln( 1 - n );
- Q1 := Q1 + Ln( n );
-//*)
+ P1 := P1 * ( 1 - n );
+ Q1 := Q1 * n;
end;
+ cnt := wordCount.Count;
if cnt = 0 then
cnt := 1;
-//(*
- P1 := prbx( -2 * P1, 2 * cnt );
- Q1 := prbx( -2 * Q1, 2 * cnt );
-(*)
- P1 := prbx( -2 * Ln( P1 ), 2 * cnt );
- Q1 := prbx( -2 * Ln( Q1 ), 2 * cnt );
-//*)
- if P1 + Q1 = 0 then begin
- Result := 0.5
- end else begin
- Result := (1 + Q1 + P1) / 2;
+ try
+ P1 := Power( P1, 1 / cnt );
+ except
end;
+ try
+ Q1 := Power( Q1, 1 / cnt );
+ except
+ end;
+
+ P1 := 1 - prbx( -2 * Ln( P1 ), 2 * cnt );
+ Q1 := 1 - prbx( -2 * Ln( Q1 ), 2 * cnt );
+
+ Result := (1 + P1 - Q1) / 2;
end;