কীভাবে এনএলটিকে টোকেনাইজার ব্যবহার করে বিরামচিহ্ন থেকে মুক্তি পাবেন?


125

আমি কেবল এনএলটিকে ব্যবহার শুরু করছি এবং পাঠ্য থেকে কীভাবে শব্দের একটি তালিকা পাবেন তা আমি যথেষ্ট বুঝতে পারি না। আমি যদি ব্যবহার করি তবে আমি nltk.word_tokenize()শব্দ এবং বিরামচিহ্নগুলির একটি তালিকা পেয়েছি get পরিবর্তে আমার কেবল শব্দগুলি দরকার। আমি কীভাবে যতিচিহ্ন থেকে মুক্তি পেতে পারি? এছাড়াও word_tokenizeএকাধিক বাক্য সাথে কাজ করে না: বিন্দু শেষ কথা যোগ করা হয়।


12
আপনি নিজেই যতিচিহ্নটি অপসারণ করবেন না কেন? nltk.word_tokenize(the_text.translate(None, string.punctuation))পাইথন 3 এ কাজ করার সময় পাইথন 2 এ কাজ করা উচিত nltk.work_tokenize(the_text.translate(dict.fromkeys(string.punctuation)))
বাকুরিউ

3
এটি কাজ করে না। লেখার সাথে কিছুই হয় না।
lizarisk

NLTK দ্বারা ধরে নেওয়া কর্মপ্রবাহটি হ'ল আপনি প্রথমে বাক্যগুলিতে টোকনাইজ করুন এবং তারপরে প্রতিটি বাক্যকে শব্দের সাথে যুক্ত করুন। একারণে word_tokenize()একাধিক বাক্য দিয়ে কাজ করে না। বিরামচিহ্ন থেকে মুক্তি পেতে, আপনি একটি নিয়মিত প্রকাশ বা পাইথনের isalnum()ফাংশন ব্যবহার করতে পারেন ।
সুজানা

2
এটা তোলে করেন : কাজ >>> 'with dot.'.translate(None, string.punctuation) 'with dot'(নোট কোন ফলাফল শেষে DOT) এটা সমস্যার সৃষ্টি করতে পারে যদি আপনি ভালো জিনিস আছে 'end of sentence.No space', যে ক্ষেত্রে এই পরিবর্তে করুন: the_text.translate(string.maketrans(string.punctuation, ' '*len(string.punctuation)))যা সাদা স্পেস দিয়ে সমস্ত যতিচিহ্ন প্রতিস্থাপন করে।
বাকুরিউ

ওফস, এটি সত্যই কাজ করে তবে ইউনিকোড স্ট্রিংয়ের সাথে নয়।
লিজারিস্ক

উত্তর:


162

অন্যান্য টোকেনাইজিং বিকল্পগুলি দেখুন যা এখানে এনল্টক সরবরাহ করে । উদাহরণস্বরূপ, আপনি এমন একটি টোকেনাইজার সংজ্ঞায়িত করতে পারেন যা বর্ণচিহ্নগুলির ক্রমগুলি টোকেন হিসাবে বেছে নেয় এবং সমস্ত কিছু ফেলে দেয়:

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 এর কোনও প্রয়োজন ছাড়াই নির্লজ্জভাবে রেজেক্সে বিভক্ত করতে পারেন ।
এসএফসিসি

3
@ এসএফসি মন্তব্যটি বর্ণনা করার জন্য, আপনি "মিঃ" এর মতো শব্দগুলি হারাতে পারেন
গীকাজয়েড

এর পরিবর্তে 'n' 'থেকে' 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)

এবং তারপরে আপনার টোকেনাইজারে এই স্ট্রিংটি ব্যবহার করুন।

পিএস স্ট্রিং মডিউলে কিছু অন্যান্য উপাদান রয়েছে যা মুছতে পারে (অঙ্কগুলির মতো)।


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
@ মাইকেএল আপনি টোকানাইজ করার আগে আমদানি সংকোচনের এবং সংকোচনের মাধ্যমে "পারে না" এবং "না" এর মতো শব্দগুলি পেতে পারেন না ( এটি "পারে না" "" করতে পারে না "এবং" না "" "না" "তে পরিণত করবে।
zipline86

16

মন্তব্যে লক্ষ্য করা গেছে সেন্ড_ টোকেনাইজ () দিয়ে শুরু করুন কারণ শব্দ_ টোকেনাইজ () কেবলমাত্র একটি বাক্যে কাজ করে। আপনি ফিল্টার () দিয়ে বিরামচিহ্নগুলি ফিল্টার করতে পারেন। এবং যদি আপনার কাছে ইউনিকোড স্ট্রিং থাকে তা নিশ্চিত করুন যে এটি একটি ইউনিকোড অবজেক্ট ('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
@ রর্মলফ কারণ আপনার কেবলমাত্র বিরামচিহ্ন টোকেনের প্রয়োজন নেই? সুতরাং আপনি চান didএবং n'tনা.
সিপরিয়ান টমোইগা

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) যদি আপনি টোকেনাইজেশনের আগে বিরামচিহ্ন অপসারণ করেন যা আপনার প্রোগ্রামকে নেতিবাচকভাবে প্রভাবিত করতে পারে সম্ভবত is

সুতরাং সমাধানটি টোকেনাইজ করা এবং তারপরে বিরামচিহ্ন টোকেনগুলি সরিয়ে ফেলুন

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 ")

এবং আপনি যদি টোকেনটি একটি বৈধ ইংরেজি শব্দ কিনা তা পরীক্ষা করতে চান তবে আপনার পায়েনচেন্টের প্রয়োজন হতে পারে

টিউটোরিয়াল:

 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)) However তবে n'tএটি বর্ণানুক্রমিক নয় এবং প্রক্রিয়াটিতে হারিয়ে যেতে পারেন
ডিয়েগো ফেরি

1

বিরামচিহ্নগুলি সরান (এটি সরিয়ে ফেলবে well পাশাপাশি নীচের কোড ব্যবহার করে বিরামচিহ্ন পরিচালনা করার অংশ)

        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!')

এটি প্রতিটি অক্ষরের জন্য একটি টোকেন তৈরি করে।
habষভ গুপ্ত

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.