2017-10-16 11 views
0

J'essaye d'enlever la ponctuation en tokenizing une phrase dans python mais j'ai plusieurs "condtitions" où je veux ignorer tokenizing en utilisant la ponctuation. Quelques exemples sont quand je vois une URL, ou une adresse email ou certains symboles sans espaces à côté d'eux. Exemple:Python - tokenizer regex avec des conditions

from nltk.tokenize import RegexpTokenizer 
tokenizer = RegexpTokenizer("[\w']+") 

tokenizer.tokenize("please help me ignore punctuation like . or , but at the same time don't ignore if it looks like a url i.e. google.com or google.co.uk. Sometimes I also want conditions where I see an equals sign between words such as myname=shecode") 

En ce moment, la sortie ressemble

[ 's'il vous plaît', 'aide', 'me', 'ignore', 'la ponctuation', 'comme', 'ou', 'mais', 'at', 'the', 'same', 'time', 'ne pas', 'ignore', 'if', 'it', 'semble', 'like', 'a' ',' url ',' i ',' e ',' google ',' com ',' ou ',' google ',' co ', ' uk ',' Parfois ',' Je ',' aussi ' , 'want', 'conditions', 'where', 'I', 'voir', 'an', 'est égal', 'signer', 'entre', 'mots', 'tel', 'comme', 'myname', 'shecode']

Mais ce que je veux vraiment à ressembler est

[ 's'il vous plaît', 'aide', 'me', 'ignore', 'la ponctuation', 'comme', 'ou', 'mais', 'at', 'the', 'same', 'time', 'ne pas', 'ignore', 'if', 'it', 'semble', 'like', 'a' ',' url ',' i ',' e ',' google.com ',' ou ',' google.co.uk ', ' Parfois ',' I ',' aussi ',' vouloir ',' conditions ',' where ',' I ',' voir ', ' an ',' equals ',' signe ',' entre ',' mots ',' tels ',' as ', ' myname = shecode ' ]

+0

Essayez d'utiliser "de word_tokenize import nltk.tokenize". Je ne suis pas sûr si cela va résoudre votre but. Mais essayez-le une fois. Merci. – Gunjan

+0

Vous devriez: a) pré-marquer l'entrée sur les espaces; b) vérifier chaque morceau pour décider s'il s'agit d'une url ou non; et c) gérer les urls et les jetons non-url différemment. – alexis

Répondre

0

Changer votre regex à l'expression suivante

tokenizer = RegexpTokenizer("[\w+.]+") 

Dans regex . signifie tout caractère.

Donc, dans votre code, il est également divisé sur .. Donc, la nouvelle regex va empêcher le fractionnement .

+0

Salut, parfois je veux le diviser, mais ce sera conditionnel. peut-être si nous voyons un ".com" ou .co. "alors nous ne voulons pas qu'il soit scindé, est-ce que cela a du sens? – shecode

+0

dans regex' .' signifie n'importe quel caractère, sauf entre les parenthèses '[' et ']' – Indent

0

Essayez d'utiliser ce code, si cela fonctionne pour vous.

from nltk.tokenize import word_tokenize 
punct_list = ['!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~'] 
s = "please help me ignore punctuation like . or , but at the same time don't ignore if it looks like a url i.e. google.com or google.co.uk. Sometimes I also want conditions where I see an equals sign between words such as myname=shecode" 
print [i.strip("".join(punct_list)) for i in word_tokenize(s) if i not in punct_list] 

Cocher cette How to remove punctuation? ainsi

0

Vous pouvez utiliser le tokenize un regex plus complexe, par exemple TreebankTokenizer de nltk.word_tokenize, voir How do I tokenize a string sentence in NLTK?:

>>> from nltk import word_tokenize 
>>> text ="please help me ignore punctuation like . or , but at the same time don't ignore if it looks like a url i.e. google.com or google.co.uk. Sometimes I also want conditions where I see an equals sign between words such as myname=shecode" 
>>> word_tokenize(text) 
['please', 'help', 'me', 'ignore', 'punctuation', 'like', '.', 'or', ',', 'but', 'at', 'the', 'same', 'time', 'do', "n't", 'ignore', 'if', 'it', 'looks', 'like', 'a', 'url', 'i.e', '.', 'google.com', 'or', 'google.co.uk', '.', 'Sometimes', 'I', 'also', 'want', 'conditions', 'where', 'I', 'see', 'an', 'equals', 'sign', 'between', 'words', 'such', 'as', 'myname=shecode'] 

Et si vous souhaitez supprimer les mots vides, voir Stopword removal with NLTK

>>> from string import punctuation 
>>> from nltk.corpus import stopwords 
>>> from nltk import word_tokenize 

>>> stoplist = stopwords.words('english') + list(punctuation) 

>>> text ="please help me ignore punctuation like . or , but at the same time don't ignore if it looks like a url i.e. google.com or google.co.uk. Sometimes I also want conditions where I see an equals sign between words such as myname=shecode" 

>>> word_tokenize(text) 
['please', 'help', 'me', 'ignore', 'punctuation', 'like', '.', 'or', ',', 'but', 'at', 'the', 'same', 'time', 'do', "n't", 'ignore', 'if', 'it', 'looks', 'like', 'a', 'url', 'i.e', '.', 'google.com', 'or', 'google.co.uk', '.', 'Sometimes', 'I', 'also', 'want', 'conditions', 'where', 'I', 'see', 'an', 'equals', 'sign', 'between', 'words', 'such', 'as', 'myname=shecode'] 

>>> [token for token in word_tokenize(text) if token not in stoplist] 
['please', 'help', 'ignore', 'punctuation', 'like', 'time', "n't", 'ignore', 'looks', 'like', 'url', 'i.e', 'google.com', 'google.co.uk', 'Sometimes', 'I', 'also', 'want', 'conditions', 'I', 'see', 'equals', 'sign', 'words', 'myname=shecode']