9

単純ベイズを使用して、ドキュメントを比較的多数のクラスに分類したいと考えています。私は、エンティティが正しく検証された記事とその記事が類似しているかどうかに基づいて、記事内のエンティティ名の言及が本当にそのエンティティであるかどうかを確認しようとしています。

たとえば、ある記事で「General Motors」というテキストを見つけたとします。記事とその中で言及されている正しいエンティティを含む一連のデータがあります。したがって、新しい記事で言及されている「ゼネラルモーターズ」が見つかった場合、既知の本物を含む以前のデータの記事のクラスに該当する必要があります。 「ゼネラルモーターズ」に言及するのと、そのエンティティに言及していない記事のクラスとの比較は?

(すべてのエンティティのクラスを作成して、すべての新しい記事を可能なすべてのクラスに分類しようとしているわけではありません。エンティティ名のもっともらしい言及を見つけるためのヒューリスティックな方法が既にあり、限られた数の妥当性を検証したいだけです。メソッドが既に検出した記事ごとのエンティティ名の言及)。

潜在的なクラスと記事の数が非常に多く、単純なベイズが比較的単純であることを考えると、SQL ですべてを実行したかったのですが、スコアリング クエリに問題があります...

これが私がこれまでに持っているものです:

CREATE TABLE `each_entity_word` (
  `word` varchar(20) NOT NULL,
  `entity_id` int(10) unsigned NOT NULL,
  `word_count` mediumint(8) unsigned NOT NULL,
  PRIMARY KEY (`word`, `entity_id`)
);

CREATE TABLE `each_entity_sum` (
  `entity_id` int(10) unsigned NOT NULL DEFAULT '0',
  `word_count_sum` int(10) unsigned DEFAULT NULL,
  `doc_count` mediumint(8) unsigned NOT NULL,
  PRIMARY KEY (`entity_id`)
);

CREATE TABLE `total_entity_word` (
  `word` varchar(20) NOT NULL,
  `word_count` int(10) unsigned NOT NULL,
  PRIMARY KEY (`word`)
);

CREATE TABLE `total_entity_sum` (
  `word_count_sum` bigint(20) unsigned NOT NULL,
  `doc_count` int(10) unsigned NOT NULL,
  `pkey` enum('singleton') NOT NULL DEFAULT 'singleton',
  PRIMARY KEY (`pkey`)
);

マークされたデータ内の各記事は個別の単語に分割され、各エンティティの各記事について、すべての単語が に追加され、each_entity_wordおよび/またはその単語がword_countインクリメントされ、doc_countインクリメントされます。これは、その記事で言及されている既知のエンティティごとに繰り返されます。entity_word_sumentity_id

各単語に含まれるエンティティに関係なく、記事ごとtotal_entity_word total_entity_word_sumに同様にインクリメントされます。

  • P(word|any document) は、その単語 のword_countinに等しい必要があり ますtotal_entity_worddoc_counttotal_entity_sum
  • P(単語|ドキュメントは エンティティx言及word_countし ています)each_entity_wordentity_id doc_counteach_entity_sumentity_id
  • P(単語|ドキュメントはエンティティxについて言及していませ) は、(そのエンティティのinからその単語のinを引いたもの) 以上 ( inのそのエンティティの inを引いたもの)に等しくなければなりませんword_counttotal_entity_wordword_counteach_entity_worddoc_counttotal_entity_sumdoc_counteach_entity_sum
  • P(ドキュメントはエンティティxdoc_countに言及しています) は、each_entity_sumそのエンティティ ID に対して等しい必要がありますdoc_counttotal_entity_word
  • P(ドキュメントはエンティティxについて言及していません) は 1 マイナス ( xのエンティティ ID に対してin )doc_countに等しい必要があります。each_entity_sumdoc_counttotal_entity_word

入ってくる新しい記事の場合、それを単語に分割し、または のいずれeach_entity_wordかに対して ('I'、'want'、'to'、'use'...) の単語を選択するだけtotal_entity_wordです。私が(mysql)で作業しているdbプラットフォームでは、IN句は比較的適切に最適化されています。

また、SQLにはproduct()集計関数がないため、もちろん、sum(log(x))またはexp(sum(log(x)))を実行して、product(x)と同等のものを取得できます。

したがって、新しい記事を取得し、それを個別の単語に分割し、それらの単語を大きな IN() 句とテストする潜在的なエンティティ ID に入れる場合、記事がそのエンティティに該当する単純なベイジアン確率を取得するにはどうすればよいですか? SQLのidのクラス?

編集:

#1を試してください:

set @entity_id = 1;

select @entity_doc_count = doc_count from each_entity_sum where entity_id=@entity_id;

select @total_doc_count = doc_count from total_entity_sum;

select 
            exp(

                log(@entity_doc_count / @total_doc_count) + 

                (
                    sum(log((ifnull(ew.word_count,0) + 1) / @entity_doc_count)) / 
                    sum(log(((aew.word_count + 1) - ifnull(ew.word_count, 0)) / (@total_doc_count - @entity_doc_count)))
                )

            ) as likelihood,
        from total_entity_word aew 
        left outer join each_entity_word ew on ew.word=aew.word and ew.entity_id=@entity_id

        where aew.word in ('I', 'want', 'to', 'use'...);
4

5 に答える 5

6

R から Postgres (または MySQL など) へのインターフェイスを使用する

または、データベースへのコネクタを備えた確立された統計パッケージを使用することをお勧めします。Naive Bayes からより洗練されたものに切り替えたい場合、これによりアプリの柔軟性が大幅に向上します。

http://rpgsql.sourceforge.net/

bnd.pr> data(airquality)

bnd.pr> db.write.table(airquality, no.clobber = F)

bnd.pr> bind.proxy("airquality")

bnd.pr> summary(airquality)
Table name: airquality 
Database: test 
Host: localhost
Dimensions: 6 (columns) 153 (rows)


bnd.pr> print(airquality)
   Day Month Ozone Solar.R Temp
1    1     5    41     190   67
2    2     5    36     118   72
3    3     5    12     149   74
4    4     5    18     313   62
5    5     5    NA      NA   56
6    6     5    28      NA   66
7    7     5    23     299   65
8    8     5    19      99   59
9    9     5     8      19   61
10  10     5    NA     194   69
Continues for 143 more rows and 1 more cols...

bnd.pr> airquality[50:55, ]
   Ozone Solar.R Wind Temp Month Day
50    12     120 11.5   73     6  19
51    13     137 10.3   76     6  20
52    NA     150  6.3   77     6  21
53    NA      59  1.7   76     6  22
54    NA      91  4.6   76     6  23
55    NA     250  6.3   76     6  24

bnd.pr> airquality[["Ozone"]]
  [1]  41  36  12  18  NA  28  23  19   8  NA   7  16  11  14  18  14  34   6
 [19]  30  11   1  11   4  32  NA  NA  NA  23  45 115  37  NA  NA  NA  NA  NA
 [37]  NA  29  NA  71  39  NA  NA  23  NA  NA  21  37  20  12  13  NA  NA  NA
 [55]  NA  NA  NA  NA  NA  NA  NA 135  49  32  NA  64  40  77  97  97  85  NA
 [73]  10  27  NA   7  48  35  61  79  63  16  NA  NA  80 108  20  52  82  50
 [91]  64  59  39   9  16  78  35  66 122  89 110  NA  NA  44  28  65  NA  22
[109]  59  23  31  44  21   9  NA  45 168  73  NA  76 118  84  85  96  78  73
[127]  91  47  32  20  23  21  24  44  21  28   9  13  46  18  13  24  16  13
[145]  23  36   7  14  30  NA  14  18  20

次に、e1071 パッケージをインストールして Naive Bayes を実行します。R プロンプトで:

[ramanujan:~/base]$R

R version 2.7.2 (2008-08-25)
Copyright (C) 2008 The R Foundation for Statistical Computing
ISBN 3-900051-07-0

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.


 ~/.Rprofile loaded.
Welcome at  Sun Apr 19 00:45:30 2009
> install.packages("e1071")  
> install.packages("mlbench")
> library(e1071)
> ?naiveBayes
> example(naiveBayes)

より詳しい情報:

http://cran.r-project.org/web/packages/e1071/index.html

于 2009-04-19T07:48:23.593 に答える
2

これは、SQL Server の単純なバージョンです。無料の SQL Express 実装で実行しましたが、かなり高速です。

http://sqldatamine.blogspot.com/2013/07/classification-using-naive-bayes.html

于 2014-02-25T16:21:35.847 に答える
1

数式のすべての式を計算する時間がありませんがNB、主なアイデアは次のとおりです。

SET @entity = 123;

SELECT  EXP(SUM(LOG(probability))) / (EXP(SUM(LOG(probability))) + EXP(SUM(LOG(1 - probability))))
FROM    (
        SELECT  @entity AS _entity,
                /* Above is required for efficiency, subqueries using _entity will be DEPENDENT and use the indexes */
                (
                SELECT  SUM(word_count)
                FROM    total_entity_word
                WHERE   word = d.word
                )
                /
                (
                SELECT  doc_count
                FROM    each_entity_sum
                WHERE   entity_id = _entity
                ) AS pwordentity,
                /* I've just referenced a previously selected field */
                (
                SELECT  1 - pwordentity
                ) AS pwordnotentity,
                /* Again referenced a previously selected field */
                ... etc AS probability
        FROM    total_entity_word
        ) q

SELECT相関サブクエリで前のフィールドを使用することで、前のフィールドを簡単に参照できることに注意してください(例のように)。

于 2009-04-13T16:13:22.200 に答える
0

Oracle を使用している場合は、データ マイニングが組み込まれています。

実行しているデータベースはわかりませんが、Oracle を使用している場合は、データ マイニング機能がデータベースに組み込まれています。

http://www.oracle.com/technology/products/bi/odm/index.html

...ナイーブベイズを含む:

http://download.oracle.com/docs/cd/B28359_01/datamine.111/b28129/algo_nb.htm

および他のトン:

http://www.oracle.com/technology/products/bi/odm/odm_techniques_algorithms.html

それは私にとって驚くべきことでした。オラクルがこの分野でオープンソースの代替品よりも優れていることは間違いありません。

于 2009-04-19T07:40:16.750 に答える
0

あなたが探しているものを詳述したブログ投稿は次のとおりです

私は多くのバージョンの NB 分類子を SQL でコーディングしました。分析パッケージの変更を提唱する上記の回答は、私の大規模なデータと処理時間の要件に対応できませんでした。各単語/クラスの組み合わせ (nrows = 単語 * クラス) と係数列の行を含むテーブルがありました。document_id と word の列を持つ別のテーブルがありました。これらのテーブルを単語ごとに結合し、ドキュメントごとにグループ化し、係数を合計してから、クラス確率の合計を調整しました。これにより、document_id、class、score のテーブルが残りました。次に、最小スコアを選択しました(複数クラスの状況でよりうまく機能することがわかった、補完的な単純なベイズアプローチを行っていたため)。

補足として、多くの変換/アルゴリズムの変更により、ホールドアウトの予測が大幅に改善されることがわかりました。それらについては、Jason Rennie の「Tackling the Poor Assumptions of Naive Bayes Text Classifiers」に関する著作で説明されており、ここに要約されています

于 2011-02-22T17:54:24.997 に答える