Y a-t-il une bonne bibliothèque capable de détecter et de séparer les mots d'une chaîne combinée?Détecter les mots les plus probables du texte sans espaces/mots combinés
Exemple:
"cdimage" -> ["cd", "image"]
"filesaveas" -> ["file", "save", "as"]
Y a-t-il une bonne bibliothèque capable de détecter et de séparer les mots d'une chaîne combinée?Détecter les mots les plus probables du texte sans espaces/mots combinés
Exemple:
"cdimage" -> ["cd", "image"]
"filesaveas" -> ["file", "save", "as"]
est ici une solution de programmation dynamique (mis en œuvre en fonction memoized).Étant donné un dictionnaire de mots avec leurs fréquences, il divise le texte d'entrée aux positions qui donnent la phrase la plus probable. Vous devrez trouver une vraie liste de mots, mais j'ai inclus quelques fréquences inventées pour un test simple.
WORD_FREQUENCIES = {
'file': 0.00123,
'files': 0.00124,
'save': 0.002,
'ave': 0.00001,
'as': 0.00555
}
def split_text(text, word_frequencies, cache):
if text in cache:
return cache[text]
if not text:
return 1, []
best_freq, best_split = 0, []
for i in xrange(1, len(text) + 1):
word, remainder = text[:i], text[i:]
freq = word_frequencies.get(word, None)
if freq:
remainder_freq, remainder = split_text(
remainder, word_frequencies, cache)
freq *= remainder_freq
if freq > best_freq:
best_freq = freq
best_split = [word] + remainder
cache[text] = (best_freq, best_split)
return cache[text]
print split_text('filesaveas', WORD_FREQUENCIES, {})
--> (1.3653e-08, ['file', 'save', 'as'])
Je ne connais pas de bibliothèque, mais il ne devrait pas être difficile à mettre en œuvre les fonctionnalités de base.
words
UNIX.Exemple:
Quel est le temps d'exécution de ceci? Je ne suis pas en mesure de généraliser suffisamment ce problème pour trouver sa complexité Big-O précise. –
Je ne sais pas une bibliothèque qui fait cela, mais il est pas trop difficile d'écrire si vous avez une liste de mots:
wordList = file('words.txt','r').read().split()
words = set(s.lower() for s in wordList)
def splitString(s):
found = []
def rec(stringLeft, wordsSoFar):
if not stringLeft:
found.append(wordsSoFar)
for pos in xrange(1, len(stringLeft)+1):
if stringLeft[:pos] in words:
rec(stringLeft[pos:], wordsSoFar + [stringLeft[:pos]])
rec(s.lower(), [])
return found
Ceci renverra toutes les façons possibles pour diviser la chaîne en les mots donnés.
Exemple:
>>> splitString('filesaveas')
[['file', 'save', 'as'], ['files', 'ave', 'as']]
si vous ne faites pas cela pour le plaisir, mais il est en train de faire quelque chose pour le travail etc, mon conseil est d'aborder ce à la source. Pourquoi avez-vous ces chaînes combinées comme ça? Où avez-vous eu ces ficelles? Si c'est possible, insérez des espaces à la source de l'origine de ces chaînes.
désolé, mais c'est une réponse à tous les problèmes. (Q: "comment peindre la maison en blanc?" -> A: "ajouter du calcium blanc à la terre et venir 1 million d'années plus tard et creuser des briques blanches en premier lieu") –
Amener les gens à les résoudre comme un captcha sur votre site :)
Je sais que cette question est marquée pour Python mais j'avais besoin d'une implémentation JavaScript. En quittant les réponses précédentes, je me suis dit que je partagerais mon code. Semble travailler décemment.
Remarque: "_dictionary" devrait être un tableau de mots triés par fréquence. J'utilise une liste de mots du projet Gutenberg.
Je n'ai aucune expérience dans ce domaine, mais vous voudrez peut-être commencer par jeter un oeil à la boîte à outils du langage naturel. http://www.nltk.org/ –
Et FileSaveAs pourraient être divisés * ave fichiers comme * pas simplement le fichier * Enregistrer sous * Il serait difficile simplement de partager sur les possibilités de mot, sauf si vous avez un vocabulaire spécialisé. – Sparky
Et ["c", "dim", "age"], ["cd", "i", "mage"], etc ... ce n'est pas facile de le faire correctement sans connaître le contexte. Il devient encore plus difficile de choisir la bonne option lorsqu'il existe de nombreux termes et abréviations propres au domaine qui sont rares dans le texte normal mais communs dans les entrées attendues typiques. Vous auriez probablement besoin de former l'algorithme. –