web-dev-qa-db-fra.com

Tokenize mots dans une liste de phrases Python

j'ai actuellement un fichier qui contient une liste qui ressemble à 

example = ['Mary had a little lamb' , 
           'Jack went up the hill' , 
           'Jill followed suit' ,    
           'i woke up suddenly' ,
           'it was a really bad dream...']

"exemple" est une liste de telles phrases, et je veux que la sortie ressemble à:

mod_example = ["'Mary' 'had' 'a' 'little' 'lamb'" , 'Jack' 'went' 'up' 'the' 'hill' ....].__ et ainsi de suite. J'ai besoin que les phrases soient séparées avec chaque mot tokenisé pour pouvoir comparer chaque mot d'une phrase de mod_example (à la fois en utilisant for boucle) avec une phrase de référence.

J'ai essayé ceci:

for sentence in example:
    text3 = sentence.split()
    print text3 

et a obtenu le suivant en sortie: 

['it', 'was', 'a', 'really', 'bad', 'dream...']

Comment puis-je obtenir cela pour toutes les phrases? il continue à écraser. et oui, mentionnez également si mon approche est correcte? cela devrait rester une liste de phrases avec les mots symbolisés .. merci

8
Hypothetical Ninja

Vous pouvez utiliser le tokenizer Word dans NLTK ( http://nltk.org/api/nltk.tokenize.html ) avec une liste de compréhension, voir http://docs.python.org/2/tutorial /datastructures.html#list-comprehensions

>>> from nltk.tokenize import Word_tokenize
>>> example = ['Mary had a little lamb' , 
...            'Jack went up the hill' , 
...            'Jill followed suit' ,    
...            'i woke up suddenly' ,
...            'it was a really bad dream...']
>>> tokenized_sents = [Word_tokenize(i) for i in example]
>>> for i in tokenized_sents:
...     print i
... 
['Mary', 'had', 'a', 'little', 'lamb']
['Jack', 'went', 'up', 'the', 'hill']
['Jill', 'followed', 'suit']
['i', 'woke', 'up', 'suddenly']
['it', 'was', 'a', 'really', 'bad', 'dream', '...']
19
alvas

Vous pouvez utiliser nltk (comme @alvas suggère ) et une fonction récursive qui prend n'importe quel objet et marque chaque str en

from nltk.tokenize import Word_tokenize
def tokenize(obj):
    if obj is None:
        return None
    Elif isinstance(obj, str): # basestring in python 2.7
        return Word_tokenize(obj)
    Elif isinstance(obj, list):
        return [tokenize(i) for i in obj]
    else:
        return obj # Or throw an exception, or parse a dict...

Usage:

data = [["Lorem ipsum dolor. Sit amet?", "Hello World!", None], ["a"], "Hi!", None, ""]
print(tokenize(data))

Sortie:

[[['Lorem', 'ipsum', 'dolor', '.', 'Sit', 'amet', '?'], ['Hello', 'World', '!'], None], [['a']], ['Hi', '!'], None, []]
0
hayj

Pour moi, il est difficile de dire ce que vous essayez de faire.

Que dis-tu de ça

exclude = set(['Mary', 'Jack', 'Jill', 'i', 'it'])

mod_example = []
for sentence in example:
    words = sentence.split()
    # Optionally sort out some words
    for Word in words:
        if Word in exclude:
            words.remove(Word)
    mod_example.append('\'' + '\' \''.join(words) + '\'')

print mod_example

Quelles sorties

["'had' 'a' 'little' 'lamb'", "'went' 'up' 'the' 'hill'", "'followed' 'suit'", 
"'woke' 'up' 'suddenly'", "'was' 'a' 'really' 'bad' 'dream...'"]
>>> 

Edit: Une autre suggestion basée sur des informations supplémentaires données par l'OP

example = ['Area1 Area1 street one, 4454 hikoland' ,
           'Area2 street 2, 52432 hikoland, area2' ,
           'Area3 ave three, 0534 hikoland' ]

mod_example = []
for sentence in example:
    words = sentence.split()
    # Sort out some words
    col1 = words[0]
    col2 = words[1:]
    if col1 in col2:
        col2.remove(col1)
    Elif col1.lower() in col2:
        col2.remove(col1.lower())
    mod_example.append(col1 + ': ' + ' '.join(col2))

Les sorties

>>>> print mod_example
['Area1: street one, 4454 hikoland', 'Area2: street 2, 52432 hikoland,', 
'Area3: ave three, 0534 hikoland']
>>> 
0
embert

je fais ce script pour que tout le monde comprenne comment créer un code, afin de pouvoir créer lui-même le moteur de traitement du langage naturel.

import re
from contextlib import redirect_stdout
from io import StringIO

example = 'Mary had a little lamb, Jack went up the hill, Jill followed suit, i woke up suddenly, it was a really bad dream...'

def token_to_sentence(str):
    f = StringIO()
    with redirect_stdout(f):
        regex_of_sentence = re.findall('([\w\s]{0,})[^\w\s]', str)
        regex_of_sentence = [x for x in regex_of_sentence if x is not '']
        for i in regex_of_sentence:
            print(i)
        first_step_to_sentence = (f.getvalue()).split('\n')
    g = StringIO()
    with redirect_stdout(g):
        for i in first_step_to_sentence:
            try:
                regex_to_clear_sentence = re.search('\s([\w\s]{0,})', i)
                print(regex_to_clear_sentence.group(1))
            except:
                print(i)
        sentence = (g.getvalue()).split('\n')
    return sentence

def token_to_words(str):
    f = StringIO()
    with redirect_stdout(f):
        for i in str:
            regex_of_Word = re.findall('([\w]{0,})', i)
            regex_of_Word = [x for x in regex_of_Word if x is not '']
            for Word in regex_of_Word:
                print(regex_of_Word)
        words = (f.getvalue()).split('\n')

je fais un processus différent, je recommence le processus du paragraphe, pour que tout le monde soit mieux compris du traitement de texte. Le paragraphe à traiter est:

example = 'Mary had a little lamb, Jack went up the hill, Jill followed suit, i woke up suddenly, it was a really bad dream...'

tokenize paragraphe to phrase:

sentence = token_to_sentence(example)

résultera:

['Mary had a little lamb', 'Jack went up the hill', 'Jill followed suit', 'i woke up suddenly', 'it was a really bad dream']

tokenize to words:

words = token_to_words(sentence)

résultera:

['Mary', 'had', 'a', 'little', 'lamb', 'Jack', 'went, 'up', 'the', 'hill', 'Jill', 'followed', 'suit', 'i', 'woke', 'up', 'suddenly', 'it', 'was', 'a', 'really', 'bad', 'dream']

je vais expliquer comment cela fonctionne. 

d’abord, j’ai utilisé regex pour rechercher tous les mots et espaces qui séparent les mots et s’arrêtent jusqu’à trouver une ponctuation, la regex est:

([\w\s]{0,})[^\w\s]{0,}

donc le calcul sera pris les mots et les espaces entre parenthèses:

'(Mary had a little lamb),( Jack went up the hill, Jill followed suit),( i woke up suddenly),( it was a really bad dream)...'

le résultat n'est toujours pas clair, contient des caractères 'Aucun'. J'ai donc utilisé ce script pour supprimer les caractères "Aucun":

[x for x in regex_of_sentence if x is not '']

donc le paragraphe va tokenize à phrase, mais pas phrase claire le résultat est:

['Mary had a little lamb', ' Jack went up the hill', ' Jill followed suit', ' i woke up suddenly', ' it was a really bad dream']

comme vous voyez le résultat montre une phrase commençant par un espace. donc pour faire un paragraphe clair sans commencer par un espace, je fais cette regex:

\s([\w\s]{0,})

cela fera une phrase claire comme:

['Mary had a little lamb', 'Jack went up the hill', 'Jill followed suit', 'i woke up suddenly', 'it was a really bad dream']

donc, nous devons faire deux processus pour obtenir un bon résultat.

la réponse à votre question est de commencer à partir d'ici ...

pour marquer la phrase en mots, je fais l'itération de paragraphe et utilise regex juste pour capturer le mot alors qu'il itérait avec cette regex:

([\w]{0,})

et effacez à nouveau les caractères vides avec:

[x for x in regex_of_Word if x is not '']

donc le résultat est vraiment clair que la liste de mots:

['Mary', 'had', 'a', 'little', 'lamb', 'Jack', 'went, 'up', 'the', 'hill', 'Jill', 'followed', 'suit', 'i', 'woke', 'up', 'suddenly', 'it', 'was', 'a', 'really', 'bad', 'dream']

à l'avenir, pour faire une bonne PNL, vous devez disposer de votre propre base de phrases et rechercher si la phrase est dans la phrase, après avoir fait une liste de phrases, le reste des mots est clair sous forme de mot.

avec cette méthode, je peux construire ma propre PNL dans ma langue (bahasa Indonesia) qui manque vraiment de module.

édité:

je ne vois pas votre question qui veut comparer les mots. vous avez donc une autre phrase à comparer .... je vous donne un bonus, pas seulement un bonus, je vous explique comment le compter.

mod_example = ["'Mary' 'had' 'a' 'little' 'lamb'" , 'Jack' 'went' 'up' 'the' 'hill']

dans ce cas, vous devez suivre les étapes suivantes: 1. iter le mod_example 2. compare la première phrase avec les mots de mod_example . 3. faire des calculs

donc le script sera:

import re
from contextlib import redirect_stdout
from io import StringIO

example = 'Mary had a little lamb, Jack went up the hill, Jill followed suit, i woke up suddenly, it was a really bad dream...'
mod_example = ["'Mary' 'had' 'a' 'little' 'lamb'" , 'Jack' 'went' 'up' 'the' 'hill']

def token_to_sentence(str):
    f = StringIO()
    with redirect_stdout(f):
        regex_of_sentence = re.findall('([\w\s]{0,})[^\w\s]', str)
        regex_of_sentence = [x for x in regex_of_sentence if x is not '']
        for i in regex_of_sentence:
            print(i)
        first_step_to_sentence = (f.getvalue()).split('\n')
    g = StringIO()
    with redirect_stdout(g):
        for i in first_step_to_sentence:
            try:
                regex_to_clear_sentence = re.search('\s([\w\s]{0,})', i)
                print(regex_to_clear_sentence.group(1))
            except:
                print(i)
        sentence = (g.getvalue()).split('\n')
    return sentence

def token_to_words(str):
    f = StringIO()
    with redirect_stdout(f):
        for i in str:
            regex_of_Word = re.findall('([\w]{0,})', i)
            regex_of_Word = [x for x in regex_of_Word if x is not '']
            for Word in regex_of_Word:
                print(regex_of_Word)
        words = (f.getvalue()).split('\n')

def convert_to_words(str):
    sentences = token_to_sentence(str)
    for i in sentences:
        Word = token_to_words(i)
    return Word

def compare_list_of_words__to_another_list_of_words(from_strA, to_strB):
        fromA = list(set(from_strA))
        for Word_to_match in fromA:
            totalB = len(to_strB)
            number_of_match = (to_strB).count(Word_to_match)
            data = str((((to_strB).count(Word_to_match))/totalB)*100)
            print('words: -- ' + Word_to_match + ' --' + '\n'
            '       number of match    : ' + number_of_match + ' from ' + str(totalB) + '\n'
            '       percent of match   : ' + data + ' percent')



#prepare already make, now we will use it. The process start with script below:

if __== '__main__':
    #tokenize paragraph in example to sentence:
    getsentences = token_to_sentence(example)

    #tokenize sentence to words (sentences in getsentences)
    getwords = token_to_words(getsentences)

    #compare list of Word in (getwords) with list of words in mod_example
    compare_list_of_words__to_another_list_of_words(getwords, mod_example)
0
Wahyu Bram