Есть ли способ определить, какая строка больше всего отображается в определенной строке? - PullRequest
1 голос
/ 04 ноября 2019

Я настраиваю базу данных, и у этой базы есть несколько обзоров. Я хочу выбрать обзор, и я хочу определить слово, которое встречается чаще всего в этом обзоре. Например, скажем, обзор «ужасная еда, ужасное обслуживание, плохое место». Я хочу вернуть слово ужасное. Я работаю на Oracle 11g Express .

Я на самом деле полностью озадачен этим. Я бы знал, как это сделать, если строки содержат только одну строку, но поскольку строки содержат несколько строк (полные абзацы), для меня это становится проблемой. Я использую PL / SQl, поэтому я не ограничен только операторами SQL.

Вот моя таблица отзывов

CREATE TABLE REVIEW (
review_id INT,
review_text CLOB,
primary key (review_id));

Как я уже сказал, я довольнопоставлен в тупик на этом. Я не могу найти слишком много информации о том, как отсортировать большую строку текста, а затем найти наиболее распространенную строку, встречающуюся в тексте.

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Есть пара вещей, с которыми нужно обращаться, например, такие слова, как «Ужасная еда, ужасное обслуживание, плохое место». Должны ли "ужасные" и "ужасные" считаться вместе и устранение пунктуации. Они могут быть обработаны с помощью регулярных выражений. Также, если несколько слов имеют одинаковое количество, каждое должно быть показано. Следующий ответ это положительный.

with review as
      -- CTE (Oracle: Subquery Factoring) for test data. TO BE Replaced by actual table.
     (select 'Terrible food, terrible service, bad, bad place' || chr(13) || chr(10) || 'Just stay away!!' review_text from dual)
   , review_words as
     -- Strip target string of Punctuation and Control characters, also reduce multiple spaces to single space
     (select regexp_replace(regexp_replace(review_text,'[[:punct:][:cntrl:]]',' '),'\s{2,}',' ') rwords
        from review
     )
   , word_list as 
     -- Now from result of above the individual words and convert to lower case.
     ( select lower(regexp_substr(rwords,'[^ ]+',1,rownum)) words 
         from review_words connect by level <=  regexp_count(rwords,' ') 
     )
-- get each word and count highest ranked words.
select word, cnt 
  from ( -- Rank the Word count  
         select word, cnt, rank() over(order by cnt desc) rnk
           from (-- get the number of occurrence of eah word.
                 select words word, count(*) cnt 
                   from word_list   
                  group by words
                )
       )
 where rnk = 1;

См. скрипка здесь.

0 голосов
/ 04 ноября 2019

Может быть, что-то вроде этого поможет ... Я нашел это АРТИКУЛ

И я немного переконфигурировал его, чтобы он нашел наиболее распространенную электронную почту в столбце clob. Вот запрос:

with emails as (
  select 
    cast(trim(
      regexp_substr(t.toaddress, '[^,]+', 1, levels.column_value)
    ) as varchar2(320)) as email,
    domain,
    id
  from  t,
        table(cast(multiset(
          select level from dual 
          connect by level <= length (regexp_replace(t.toaddress, '[^,]+')) + 1
        ) as sys.OdciNumberList)) levels
)
  select email from (select email, count(email) ce
  from   emails
  group by email) where ce = (select max(ce) 
                              from (select email, count(email) ce
                                    from   emails
                                    group by email));

А вот и DEMO Но вся слава достается Коннор Макдональд

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...