Частоты слов из строк в Postgres? - PullRequest
8 голосов
/ 08 марта 2011

Можно ли идентифицировать отдельные слова и количество для каждого из полей, содержащих текстовые строки в Postgres?

Ответы [ 3 ]

18 голосов
/ 08 марта 2011

Как то так?

SELECT some_pk, 
       regexp_split_to_table(some_column, '\s') as word
FROM some_table

Получить отдельные слова легко, тогда:

SELECT DISTINCT word
FROM ( 
  SELECT regexp_split_to_table(some_column, '\s') as word
  FROM some_table
) t

или подсчет каждого слова:

SELECT word, count(*)
FROM ( 
  SELECT regexp_split_to_table(some_column, '\s') as word
  FROM some_table
) t
GROUP BY word
13 голосов
/ 24 июля 2014

Для этого вы также можете использовать функцию текстового поиска PostgreSQL, например:

SELECT * FROM ts_stat('SELECT to_tsvector(''hello dere hello hello ridiculous'')');

даст:

  word   | ndoc | nentry 
---------+------+--------
 ridicul |    1 |      1
 hello   |    1 |      3
 dere    |    1 |      1
(3 rows)

(PostgreSQL применяет зависящие от языка основы и удаление стоп-слов, что может быть тем, что вам нужно, а может и нет. Удаление стоп-слов и создание основы можно отключить с помощью simple вместо словаря english, см. ниже.)

Вложенный оператор SELECT может быть любым оператором select, который возвращает столбец tsvector, поэтому вы можете заменить функцию, которая применяет функцию to_tsvector к любому количеству текстовых полей, и объединить их в один tsvector, по любому подмножеству ваших документов, например:

SELECT * FROM ts_stat('SELECT to_tsvector(''english'',title) || to_tsvector(''english'',body) from my_documents id < 500') ORDER BY nentry DESC;

Получил бы матрицу общего количества слов, взятых из полей title и body первых 500 документов, отсортированных по убыванию числа вхождений. За каждое слово вы также получите количество документов, в которых оно встречается (столбец ndoc).

Для получения более подробной информации см. Документацию: http://www.postgresql.org/docs/current/static/textsearch.html

5 голосов
/ 19 июня 2012

Должен быть разделен пробелом '' или другим символом-разделителем между словами; не знаком 's', если только не намеревается сделать это, например, трактуя 'myWordshere' как 'myWord' и 'here'.

SELECT word, count(*)
FROM ( 
  SELECT regexp_split_to_table(some_column, ' ') as word
  FROM some_table
) t
GROUP BY word
...