计算单词在文本中出现的次数

时间:2019-06-03 14:36:59

标签: mysql sql

我试图使单词在不同的文章中出现最多。

例如:

Table : Articles

Id     Article

1      <b>Une santé digitale au plus près des besoins des patients et des soignants ? Direction Medidays </b> <u> <br> </u><br/>Paris, le mercredi 29 mai 2019 – Si l’on en croit l’ensemble des programmes de santé publique et tous les projets publics et privés dédiés à l’organisation des soins, les outils digitaux seront demain incontournables pour faciliter la pratique des professionnels de santé et améliorer le quotidien des patients. Pourtant, aujourd’hui, un nombre non négligeable des outils qui ont déjà été développés ne se différencient guère de gadgets au pire ou ne présentent pas de valeur ajoutée fondamentale par rapport aux systèmes classiques au mieux. <br/><b>Quarante-huit heures d’effervescence</b><br/>Inclure les professionnels de santé et les représentants de patients dans la conception des projets digitaux est sans doute la voie à suivre pour corriger cet écueil. Aussi, étaient-ils des participants de premier plan lors des Medidays, premier hackaton e-santé organisé par l’Assistance publique – hôpitaux de Paris (AP)-(HP) et Doctolib le week-end dernier. Pendant quarante-huit heures, dans une belle effervescence, vingt-deux équipes comptant des professionnels de santé, des cadres de santé, des patients, des développeurs, des designers ou encore des graphistes ont travaillé sans relâche pour présenter à un jury de spécialistes des projets innovants mais également adaptés à la pratique quotidienne. <br/><b>De la dépression du post partum au coaching des infirmières hospitalières</b><br/>Cinq programmes sur les trente-cinq présentés ont retenu l’attention. Ils ont tous en commun de promouvoir une amélioration directe de la prise en charge des patients ou de la vie pratique des professionnels de santé. Ainsi, « <i>Docteur Simone</i> » est une application proposée par Anne-Charlotte Dimmy pour améliorer la prévention de la dépression post-partum. « Chat marche » imaginée par Flavien Quijoux promet grâce à un système de reconnaissance d’image de lutter contre la chute des personnes âgées. Quant à « <i>Post hop</i> », coup de cœur de l’AP-HP présentée par Romain Laurent, elle est dédiée à la rééducation améliorée après chirurgie. <br/>Du côté de l’amélioration de la vie pratique des professionnels de santé, deux applications ont été saluées : Supply Med, dessinée par Rubin Soudry, une marketplace digitale dédiée aux fournitures médicales dentaires et Coach My Nurse, programme de coaching destiné aux infirmières hospitalières produite par Martin Louvel. L’ensemble de ces applications bénéficieront de soutiens technologiques afin d’assurer leur développement. « <i>Nous sommes heureux de pouvoir faire émerger et d’accompagner des projets qui permettront, demain, de contribuer à la transformation du système de santé. En 48 heures, des premières solutions extrêmement prometteuses ont émergé. C’est la preuve que lorsque plusieurs acteurs de la santé se mettent en commun pour réfléchir au futur de la santé en France, des projets utiles et innovants peuvent voir le jour. Chez Doctolib, nous sommes très fiers d’avoir rendu cela possible</i> », a observé Stanislas Niox-Chateau, co-fondateur et président de Doctolib et membre du jury de la 1ère édition de Medidays. <br/> <b>Léa Crébat </b> </p>

我使用以下SQL查询:

select DISTINCT val, cnt as result from(
    select (substring_index(substring_index(t.article, ' ', n.n), ' ', -1)) val,count(*) as cnt
        from articles t cross join(

         select a.n + b.n * 10 + 1 n
         from
                (select 0 as n union all select 1 union all select 2 union all select 3 
                        union all select 4 union all select 5 union all select 6 
                        union all select 7 union all select 8 union all select 9) a,
                (select 0 as n union all select 1 union all select 2 union all select 3 
                        union all select 4 union all select 5 union all select 6 
                        union all select 7 union all select 8 union all select 9) b
                order by n 
        ) n
    where n.n <= 1 + (length(t.article) - length(replace(t.article, ' ', ''))) 
    AND (substring_index(substring_index(t.article, ' ', n.n), ' ', -1)) NOT REGEXP '^[0-9]+$' 
    AND (substring_index(substring_index(t.article, ' ', n.n), ' ', -1)) > ''
    group by val 
    order by cnt desc
) as x 
ORDER BY `result`  DESC LIMIT 5

目前我可以得到:

val   result
des     8
de      4
et      4
santé   3
au      2

但是我认为这是有问题的,因为如果我手动搜索文章,会发现“ des”出现26次,“ de”出现34次,“ et”出现11次,“santé”出现12次, “ au”出现5次。

如何获取每个单词出现在文本中的确切次数?

2 个答案:

答案 0 :(得分:0)

您仅在前100个单词中进行计数。您可以将其扩展到1000:

 (select a.n + b.n * 10 + c.n * 100 + 1 as n
  from (select 0 as n union all select 1 union all select 2 union all select 3 union all
        select 4 union all select 5 union all select 6 union all
        select 7 union all select 8 union all select 9
       ) a cross join
       (select 0 as n union all select 1 union all select 2 union all select 3 union all
        select 4 union all select 5 union all select 6 union all
        select 7 union all select 8 union all select 9
       ) b cross join
       (select 0 as n union all select 1 union all select 2 union all select 3 union all
        select 4 union all select 5 union all select 6 union all
        select 7 union all select 8 union all select 9
       ) c
) n

答案 1 :(得分:0)

我必须使用REPLACE()删除一些特殊字符

SQL DEMO

SELECT val, count(*)
FROM (
SELECT
  DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(message, ' ', n.digit + m.digit*10 + o.digit*100 + p.digit*1000 +1), ' ', -1) val,
  n.digit + m.digit*10 + o.digit*100 + p.digit*1000 as word
FROM
  (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(message, '<b>', ' '), '</p>', ' '), '</b>', ' '), '<br/>', ''), '<br>', ''), ',', ' '), '<i>', ' '), '</i>', ' '), '.', ' '), '<u>', ' '), '</u>', ' ') as message
   FROM Table1
  ) as Table1

  CROSS JOIN  (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3  UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) n
  CROSS JOIN  (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3  UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) m
  CROSS JOIN  (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3  UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) o
  CROSS JOIN  (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3  UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) p

  ON LENGTH(REPLACE(message, ' ' , '')) <= LENGTH(message)-n.digit + m.digit*10 + o.digit*100 + p.digit*1000 
)  as T
WHERE val <> ' '
GROUP BY val
ORDER BY COUNT(*) DESC