J'ai plusieurs corps de texte, et pour chacun d'entre eux, je veux extraire tous les unigrammes, bigrammes et trigrammes (mots et non caractères) et insérer les longueurs des nombres et des ngrammes dans une autre table.Quel est le moyen le plus rapide d'extraire tous les n-grammes des longueurs 1, 2 et 3 à partir d'un corps de texte dans PostgreSQL?
En ce moment, je pense à la suppression d'un corps de texte regexp-split en utilisant WITH ORDINALITY, puis en utilisant plusieurs sous-requêtes pour les bigrams et les trigrams, mais cela nécessite un ordre. Cependant, je pense que cela pourrait être un moyen inefficace d'y arriver, puisque ce genre de données positionnelles devrait normalement être accessible par index.
Je suis actuellement en train de l'implémenter en Python, et un énorme goulot d'étranglement est l'insertion de dictionnaire et la recherche de dictionnaires/ensembles pour les mots vides.
Voici un exemple très basique:
Entrée:
This is a small, small sentence.
Sortie
ngram | count | length
-------------------------------------
this | 1 | 1
is | 1 | 1
a | 1 | 1
small | 2 | 1
sentence | 1 | 1
this is | 1 | 2
is a | 1 | 2
a small | 1 | 2
small small | 1 | 2
small sentence | 1 | 2
this is a | 1 | 3
is a small | 1 | 3
a small small | 1 | 3
small small sentence | 1 | 3
Stripping la ponctuation/manipulation minuscules n'est pas un problème ici, mais obtenir le bon le nombre est important. En tant qu'étape préliminaire ou intermédiaire, j'éliminerai également les mots vides qui, dans ce cas, sont this
, a
et is
ngram | count | length
--------------------------------------
small | 2 | 1
sentence | 1 | 1
small small | 1 | 2
small sentence | 1 | 2
small small sentence | 1 | 3
Dans l'exemple ci-dessus
Pouvez-vous partager un petit échantillon de votre table/champ et vos résultats souhaités de unigrammes, bigrammes et trigrammes. Je pense que cela nous aiderait à comprendre exactement ce que vous recherchez. – JNevill