gpt4 book ai didi

sql - sql中的朴素贝叶斯计算

转载 作者:可可西里 更新时间:2023-11-01 06:30:10 27 4
gpt4 key购买 nike

我想使用朴素贝叶斯将文档分类到数量相对较多的类中。我希望根据该文章是否与已正确验证该实体的文章相似,来确认文章中提及的实体名称是否真的是该实体。

比如说,我们在一篇文章中找到了文本“通用汽车”。我们有一组数据,其中包含文章和其中提到的正确实体。因此,如果我们发现一篇新文章中提到了“通用汽车”,它是否应该属于先前数据中包含已知正品的那一类文章提及“通用汽车”与未提及该实体的文章类别?

(我不会为每个实体创建一个类,并尝试将每篇新文章分类到每个可能的类中。我已经有了一种启发式方法来查找实体名称的合理提及,我只是想验证该方法已经检测到的每篇文章中提到的实体名称数量有限。)

考虑到潜在的类和文章的数量非常大,而朴素贝叶斯相对简单,我想用 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_countentity_word_sum 中递增,两者都与 entity_id 相关。对于该文章中提及的每个已知实体重复此操作。

对于每篇文章,无论每个词包含的实体 total_entity_word total_entity_word_sum 都类似地递增。

  • P(word|any document) 应该等于word_count in total_entity_word 超过那个词在 total_entity_sum
  • 中的 doc_count
  • P(word|document mentions entity x)应该等于 word_counteach_entity_word 表示 entity_id x 超过 doc_counteach_entity_sum for entity_id x
  • P(word|document does notmention entity x) 应该等于(total_entity_word 中的 word_count 减去它在 each_entity_word 中的 word_count 表示该实体的那个词)超过(total_entity_sum 中的 doc_count 减去 doc_count each_entity_sum 中的那个实体)
  • P(document mentions entity x) 应该等于 each_entity_sum 中的 doc_count 对于 doc_count 中的那个实体 id total_entity_word
  • P(文档未提及实体 x)应等于 1 减去(doc_count in each_entity_sum for xtotal_entity_word 中超过 doc_count 的实体 ID。

对于出现的新文章,将其拆分为单词,然后根据 each_entity_word 选择单词在 ('I', 'want', 'to', 'use'...) > 或 total_entity_word。在我正在使用 (mysql) 的数据库平台中,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'...);

最佳答案

使用 R 到 Postgres(或 MySQL 等)接口(interface)

或者,我建议使用带有数据库连接器的已建立的统计数据包。如果您想从朴素贝叶斯切换到更复杂的东西,这将使您的应用程序更加灵活:

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 包来执行朴素贝叶斯。在 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

关于sql - sql中的朴素贝叶斯计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/744237/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com