एनएलटीके टोकनर का उपयोग करके विराम चिह्न से कैसे छुटकारा पाएं?


125

मैं सिर्फ एनएलटीके का उपयोग करना शुरू कर रहा हूं और मुझे यह समझ में नहीं आया कि पाठ से शब्दों की सूची कैसे प्राप्त की जाए। यदि मैं उपयोग करता हूं nltk.word_tokenize(), तो मुझे शब्दों और विराम चिह्नों की एक सूची मिलती है। मुझे इसके बजाय केवल शब्दों की आवश्यकता है। मैं विराम चिह्न से कैसे छुटकारा पा सकता हूं? word_tokenizeकई वाक्यों के साथ भी काम नहीं करता है: अंतिम शब्द में डॉट्स जोड़े जाते हैं।


12
आप अपने आप को विराम चिह्न क्यों नहीं हटाते हैं? nltk.word_tokenize(the_text.translate(None, string.punctuation))python2 में काम करना चाहिए जबकि python3 में आप कर सकते हैं nltk.work_tokenize(the_text.translate(dict.fromkeys(string.punctuation)))
बकुरीउ

3
यह काम नहीं करता है। पाठ से कुछ नहीं होता।
लिजरिस्क

एनएलटीके द्वारा माना गया वर्कफ़्लो यह है कि आप पहले वाक्यों में और फिर हर वाक्य को शब्दों में बदल देते हैं। इसीलिए word_tokenize()कई वाक्यों के साथ काम नहीं करता है। विराम चिह्न से छुटकारा पाने के लिए, आप एक नियमित अभिव्यक्ति या अजगर के isalnum()कार्य का उपयोग कर सकते हैं ।
सुजाना

2
यह काम करता है : >>> 'with dot.'.translate(None, string.punctuation) 'with dot'(परिणाम के अंत में नोट नहीं डॉट) यह समस्या हो सकती है यदि आपके पास चीजें हैं 'end of sentence.No space', तो इस मामले में इसके बजाय ऐसा करें: the_text.translate(string.maketrans(string.punctuation, ' '*len(string.punctuation)))जो सभी रिक्त स्थान को सफेद स्थानों के साथ बदल देता है।
बकुरीउ

ओह, यह वास्तव में काम करता है, लेकिन यूनिकोड के तार के साथ नहीं।
लिज़रिस्क

जवाबों:


162

अन्य टोकन विकल्पों पर एक नज़र डालें जो nltk यहां प्रदान करता है । उदाहरण के लिए, आप एक टोकन को परिभाषित कर सकते हैं जो अल्फ़ान्यूमेरिक वर्णों के अनुक्रम को टोकन के रूप में चुनता है और बाकी सब कुछ छोड़ देता है:

from nltk.tokenize import RegexpTokenizer

tokenizer = RegexpTokenizer(r'\w+')
tokenizer.tokenize('Eighty-seven miles to go, yet.  Onward!')

आउटपुट:

['Eighty', 'seven', 'miles', 'to', 'go', 'yet', 'Onward']

55
ध्यान दें कि यदि आप इस विकल्प का उपयोग करते हैं, तो आप प्राकृतिक भाषा सुविधाओं को खो देते हैं, विशेष रूप से word_tokenizeअलग संकुचन को विभाजित करना पसंद करते हैं। आप \w+NLTK की आवश्यकता के बिना रेगेक्स पर भोलेपन से विभाजन कर सकते हैं ।
sffc

3
@Sffc टिप्पणी को समझाने के लिए, आपको "मि।"
geekazoid

इसकी जगह 't' को 't' से कैसे हटाएं?
मदि। आशिकुर रहमान

46

विराम चिह्न को हटाने के लिए आपको वास्तव में एनएलटीके की आवश्यकता नहीं है। आप इसे साधारण अजगर से हटा सकते हैं। तार के लिए:

import string
s = '... some string with punctuation ...'
s = s.translate(None, string.punctuation)

या यूनिकोड के लिए:

import string
translate_table = dict((ord(char), None) for char in string.punctuation)   
s.translate(translate_table)

और फिर अपने स्ट्रिंगर में इस स्ट्रिंग का उपयोग करें।

PS स्ट्रिंग मॉड्यूल में तत्वों के कुछ अन्य सेट होते हैं जिन्हें हटाया जा सकता है (जैसे अंक)।


3
सूची अभिव्यक्ति का उपयोग करके सभी विराम चिह्न निकालें जो बहुत काम करता है। a = "*fa,fd.1lk#$" print("".join([w for w in a if w not in string.punctuation]))
जॉनी झांग

32

नीचे दिए गए कोड में सभी विराम चिह्नों के साथ-साथ गैर अक्षर वर्णों को हटा दिया जाएगा। उनकी किताब से नकल की गई।

http://www.nltk.org/book/ch01.html

import nltk

s = "I can't do this now, because I'm so tired.  Please give me some time. @ sd  4 232"

words = nltk.word_tokenize(s)

words=[word.lower() for word in words if word.isalpha()]

print(words)

उत्पादन

['i', 'ca', 'do', 'this', 'now', 'because', 'i', 'so', 'tired', 'please', 'give', 'me', 'some', 'time', 'sd']

17
बस ध्यान रखें कि इस पद्धति का उपयोग करके आप "नहीं" या "नहीं" जैसे मामलों में "नहीं" शब्द खो देंगे, जो वाक्य को समझने और वर्गीकृत करने के लिए बहुत महत्वपूर्ण हो सकता है। यह बेहतर है।
माइक

3
@MikeL आपको टंकण करने से पहले आयात संकुचन और संकुचन.फिक्स (pun_here) जैसे शब्द "नहीं" और "नहीं" नहीं मिल सकते। यह "नहीं" को "नहीं" में बदल सकता है और "नहीं" को "नहीं" में बदल देगा।
zipline86

16

जैसा कि टिप्पणियों में देखा गया है send_tokenize () से शुरू होता है, क्योंकि word_tokenize () केवल एक वाक्य पर काम करता है। आप फ़िल्टर के साथ विराम चिह्न फ़िल्टर कर सकते हैं ()। और अगर आपके पास एक यूनिकोड स्ट्रिंग्स है, तो सुनिश्चित करें कि एक यूनिकोड ऑब्जेक्ट है ('utf-8' जैसे कुछ एन्कोडिंग के साथ एनकोडेड 'str' नहीं)।

from nltk.tokenize import word_tokenize, sent_tokenize

text = '''It is a blue, small, and extraordinary ball. Like no other'''
tokens = [word for sent in sent_tokenize(text) for word in word_tokenize(sent)]
print filter(lambda word: word not in ',-', tokens)

14
पेन ट्रीबैंक टोकन में शामिल अधिकांश जटिलता को विराम चिह्न के उचित संचालन के साथ करना है। यदि आप केवल विराम चिह्न को बाहर करने जा रहे हैं तो एक महंगे टोकनर का उपयोग करें जो विराम चिह्नों को अच्छी तरह से संभालता है।
rmalouf

3
word_tokenizeएक ऐसा फंक्शन है जो रिटर्न करता है [token for sent in sent_tokenize(text, language) for token in _treebank_word_tokenize(sent)]। इसलिए मुझे लगता है कि आपका उत्तर वही कर रहा है जो पहले से ही है: उपयोग करने sent_tokenize()से पहले word_tokenize()। कम से कम यह nltk3 के लिए है।
कर्ट बॉर्बकी

2
@rmalouf क्योंकि आपको विराम चिह्न-केवल टोकन की आवश्यकता नहीं है? तो आप चाहते हैं didऔर n'tनहीं.
Ciprian Tomoiagă

11

मैंने बस निम्नलिखित कोड का उपयोग किया, जिसने सभी विराम चिह्नों को हटा दिया:

tokens = nltk.wordpunct_tokenize(raw)

type(tokens)

text = nltk.Text(tokens)

type(text)  

words = [w.lower() for w in text if w.isalpha()]

2
पाठ को टोकन क्यों परिवर्तित कर रहा है?
सादिक

6

मुझे लगता है कि आपको कुछ प्रकार के नियमित अभिव्यक्ति मिलान की आवश्यकता है (निम्नलिखित कोड पायथन 3 में है):

import string
import re
import nltk

s = "I can't do this now, because I'm so tired.  Please give me some time."
l = nltk.word_tokenize(s)
ll = [x for x in l if not re.fullmatch('[' + string.punctuation + ']+', x)]
print(l)
print(ll)

आउटपुट:

['I', 'ca', "n't", 'do', 'this', 'now', ',', 'because', 'I', "'m", 'so', 'tired', '.', 'Please', 'give', 'me', 'some', 'time', '.']
['I', 'ca', "n't", 'do', 'this', 'now', 'because', 'I', "'m", 'so', 'tired', 'Please', 'give', 'me', 'some', 'time']

ज्यादातर मामलों में अच्छी तरह से काम करना चाहिए क्योंकि यह "एनटीटी" जैसे टोकन को संरक्षित करते हुए विराम चिह्न को हटाता है, जिसे रेगेक्स टोकनर्स जैसे से प्राप्त नहीं किया जा सकता है wordpunct_tokenize


यह भी तरह बातें निकाल देंगे ...और --जबकि संरक्षण संकुचन, जो s.translate(None, string.punctuation)नहीं होगा
सीजे जैक्सन

5

साभार, एक शब्द क्या है? यदि आपकी धारणा यह है कि एक शब्द में केवल वर्णों के अक्षर होते हैं, तो आप गलत हैं क्योंकि शब्दों can'tको टुकड़ों में नष्ट कर दिया जाएगा (जैसे कि canऔर t) यदि आप टोकन से पहले विराम चिह्न हटाते हैं , जो आपके कार्यक्रम को नकारात्मक रूप से प्रभावित करने की बहुत संभावना है।

इसलिए समाधान टोकन है और फिर विराम चिह्न टोकन हटा दें

import string

from nltk.tokenize import word_tokenize

tokens = word_tokenize("I'm a southern salesman.")
# ['I', "'m", 'a', 'southern', 'salesman', '.']

tokens = list(filter(lambda token: token not in string.punctuation, tokens))
# ['I', "'m", 'a', 'southern', 'salesman']

... और फिर अगर आप चाहें तो आप कुछ टोकन जैसे जगह ले सकता है 'mके साथ am


4

विराम चिह्न हटाने के लिए मैं इस कोड का उपयोग करता हूं:

import nltk
def getTerms(sentences):
    tokens = nltk.word_tokenize(sentences)
    words = [w.lower() for w in tokens if w.isalnum()]
    print tokens
    print words

getTerms("hh, hh3h. wo shi 2 4 A . fdffdf. A&&B ")

और यदि आप यह जांचना चाहते हैं कि एक टोकन एक मान्य अंग्रेजी शब्द है या नहीं, तो आपको PyEnchant की आवश्यकता हो सकती है

ट्यूटोरियल:

 import enchant
 d = enchant.Dict("en_US")
 d.check("Hello")
 d.check("Helo")
 d.suggest("Helo")

2
खबरदार कि यह घोल संकुचन को मारता है। ऐसा इसलिए है क्योंकि word_tokenizeमानक टोकन का उपयोग करें TreebankWordTokenizer, जो संकुचन को विभाजित करता है (जैसे can't(से ca, n't))। हालांकि n'tअल्फ़ान्यूमेरिक नहीं है और प्रक्रिया में खो जाता है।
डिएगो फेर्री

1

विराम चिह्न निकालें (यह हटा देगा। साथ ही नीचे दिए गए कोड का उपयोग करके विराम चिह्नों का हिस्सा)

        tbl = dict.fromkeys(i for i in range(sys.maxunicode) if unicodedata.category(chr(i)).startswith('P'))
        text_string = text_string.translate(tbl) #text_string don't have punctuation
        w = word_tokenize(text_string)  #now tokenize the string 

नमूना इनपुट / आउटपुट:

direct flat in oberoi esquire. 3 bhk 2195 saleable 1330 carpet. rate of 14500 final plus 1% floor rise. tax approx 9% only. flat cost with parking 3.89 cr plus taxes plus possession charger. middle floor. north door. arey and oberoi woods facing. 53% paymemt due. 1% transfer charge with buyer. total cost around 4.20 cr approx plus possession charges. rahul soni

['direct', 'flat', 'oberoi', 'esquire', '3', 'bhk', '2195', 'saleable', '1330', 'carpet', 'rate', '14500', 'final', 'plus', '1', 'floor', 'rise', 'tax', 'approx', '9', 'flat', 'cost', 'parking', '389', 'cr', 'plus', 'taxes', 'plus', 'possession', 'charger', 'middle', 'floor', 'north', 'door', 'arey', 'oberoi', 'woods', 'facing', '53', 'paymemt', 'due', '1', 'transfer', 'charge', 'buyer', 'total', 'cost', 'around', '420', 'cr', 'approx', 'plus', 'possession', 'charges', 'rahul', 'soni']


बहुत बहुत धन्यवाद

1

सिर्फ @rmalouf द्वारा समाधान में जोड़ने पर, इसमें कोई भी संख्या शामिल नहीं होगी क्योंकि \ w + [a-zA-Z0-9_] के बराबर है।

from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer(r'[a-zA-Z]')
tokenizer.tokenize('Eighty-seven miles to go, yet.  Onward!')

यह प्रत्येक अक्षर के लिए एक टोकन बनाता है।
ऋषभ गुप्ता

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.