আমি স্টেমিং বা লেম্যাটাইজেশন শব্দটি কীভাবে করব?


111

আমি পোর্টারস্টেমার এবং স্নোবল চেষ্টা করেছি কিন্তু দু'জনেই সব কথায় কাজ করে না, কিছু খুব সাধারণ কথা হারিয়েছে।

আমার পরীক্ষার শব্দগুলি হ'ল : " বিড়ালগুলি চলছে ক্যাকটাস ক্যাকটাস ক্যাকটি সম্প্রদায় সম্প্রদায়গুলিতে দৌড়ে " এবং উভয়ই অর্ধেকের চেয়ে কম অধিকার পান।

আরো দেখুন:


28
ক্যাকটি হওয়া উচিত নয়?
এমসাল্টার্স

3
কেবলমাত্র রেডডিটে পোস্ট করা মূল প্রশ্নের একটি বিজ্ঞপ্তি উল্লেখ করতে: আমি কীভাবে প্রোগ্রামিয়ালি স্টেমিং করব? (যেমন "খাওয়া" থেকে "খাওয়া", "ক্যাকটাস" থেকে "ক্যাকটাস") এখানে পোস্ট করা কারণ মন্তব্যগুলিতে দরকারী তথ্য অন্তর্ভুক্ত রয়েছে।
রেনেউদ বোম্পুইস

উত্তর:


143

আপনি যদি পাইথন জানেন, দ্য ন্যাচারাল ল্যাঙ্গুয়েজ টুলকিট (এনএলটিকে) এর একটি খুব শক্তিশালী লেমমাটিজার রয়েছে যা ওয়ার্ডনেট ব্যবহার করে

মনে রাখবেন যে আপনি যদি এই লেমটিটিজারটি প্রথমবার ব্যবহার করছেন তবে আপনাকে অবশ্যই কর্পসটি ব্যবহারের আগে ডাউনলোড করতে হবে। এটি দ্বারা করা যেতে পারে:

>>> import nltk
>>> nltk.download('wordnet')

আপনি শুধুমাত্র একবার এই করতে হবে। ধরে নিই যে আপনি এখন কর্পসটি ডাউনলোড করেছেন, এটি এর মতো কাজ করে:

>>> from nltk.stem.wordnet import WordNetLemmatizer
>>> lmtzr = WordNetLemmatizer()
>>> lmtzr.lemmatize('cars')
'car'
>>> lmtzr.lemmatize('feet')
'foot'
>>> lmtzr.lemmatize('people')
'people'
>>> lmtzr.lemmatize('fantasized','v')
'fantasize'

Nltk.stem মডিউলটিতে অন্যান্য লেমটিজার রয়েছে , তবে আমি সেগুলি নিজে চেষ্টা করি নি।


11
ওরে দু: খিত ... এসও অনুসন্ধান করতে জানার আগে আমি নিজের প্রয়োগ করলাম!
ক্রিস Pfohl

12
প্রথমবারের মতো এনলেটকে ব্যবহারের আগে কর্পসটি ইনস্টল করতে ভুলবেন না ! velvetcache.org/2010/03/01/…
ম্যাথিউ রডিক

1
ভাল, এই একটি পোর্টার স্টেমার এর মতো কিছু অ-নিরস্তাত্মক অ্যালগরিদম ব্যবহার করে কারণ আপনি যদি এটির সাথে চেষ্টা করেন তবে diesএটি আপনাকে dyপরিবর্তে দেয় die। কোনও ধরণের হার্ডকোড স্টেমার অভিধান নেই?
সেক্সিবিস্ট

3
কোন ধারণা কোন শব্দটি WordNetLemmatizerভুলভাবে লেমটিটিজ করে?
আলভাস

21
nltk ওয়ার্ডনেটলিমেটিজার যুক্তি হিসাবে একটি পোস্ট ট্যাগ প্রয়োজন। ডিফল্টরূপে এটি 'এন' (বিশেষ্য হিসাবে দাঁড়িয়ে)। সুতরাং এটি ক্রিয়াপদের জন্য সঠিকভাবে কাজ করবে না। যদি পস ট্যাগগুলি উপলভ্য না থাকে তবে একটি সহজ (তবে অ্যাডহক) পদ্ধতির মধ্যে দু'বার ল্যামিটাইজেশন করা হয়, একটি 'এন' এর জন্য এবং অন্যটি 'ভি' (ক্রিয়াপদের জন্য দাঁড়িয়ে) জন্য, এবং ফলাফলটি পৃথক পৃথক থেকে বেছে নিতে হয় মূল শব্দ (সাধারণত দৈর্ঘ্যে খাটো, তবে 'রান' এবং 'রান' এর দৈর্ঘ্য একই থাকে)। দেখে মনে হচ্ছে যে আমাদের 'অ্যাডজ', 'অ্যাড', 'প্রিপ' ইত্যাদি নিয়ে উদ্বিগ্ন হওয়ার দরকার নেই কারণ তারা ইতিমধ্যে কিছুটা অর্থে মূল রূপে রয়েছে।
ফ্যাশান্ডে

29

আমি স্ট্যামফোর্ড এনপিএল লেম্যাটাইজেশন করতে ব্যবহার করি। আমি গত কয়েকদিন একই ধরণের সমস্যার সাথে আটকে ছিলাম। সমস্যা সমাধানে আমাকে সহায়তা করতে স্ট্যাকওভারফ্লোকে সমস্ত ধন্যবাদ।

import java.util.*; 
import edu.stanford.nlp.pipeline.*;
import edu.stanford.nlp.ling.*; 
import edu.stanford.nlp.ling.CoreAnnotations.*;  

public class example
{
    public static void main(String[] args)
    {
        Properties props = new Properties(); 
        props.put("annotators", "tokenize, ssplit, pos, lemma"); 
        pipeline = new StanfordCoreNLP(props, false);
        String text = /* the string you want */; 
        Annotation document = pipeline.process(text);  

        for(CoreMap sentence: document.get(SentencesAnnotation.class))
        {    
            for(CoreLabel token: sentence.get(TokensAnnotation.class))
            {       
                String word = token.get(TextAnnotation.class);      
                String lemma = token.get(LemmaAnnotation.class); 
                System.out.println("lemmatized version :" + lemma);
            }
        }
    }
}

ক্লাসিফিকেটরে যদি পরে ব্যবহার করা হয় তবে আউটপুট লেমাস কমাতে স্টপওয়ার্ডগুলি ব্যবহার করা ভাল ধারণা হতে পারে। জন কনওয়েল লিখেছেন কোরএনএলপ এক্সটেনশনটি একবার দেখুন ।


দেরিতে জবাবের জন্য দুঃখিত .. আমি এখনই এই সমস্যাটি সমাধান করেছি! :)
সিটিসিদ্ধার্থ

1
'পাইপলাইন = নতুন ...' লাইনটি আমার জন্য সংকলন করে না। যদি আমি এটিকে 'স্ট্যানফোর্ডকোরএনএলপি পাইপলেন = নতুন ...' তে পরিবর্তন করি তবে এটি সংকলিত হয়। ওস এই সঠিক?
আদম_জি

হ্যাঁ, আপনাকে প্রথমে পাইপলাইন ভার ঘোষণা করতে হবে। স্ট্যানফোর্ড এনএলপি কমান্ড লাইন থেকেও ব্যবহার করা যেতে পারে তাই আপনাকে কোনও প্রোগ্রামিং করতে হবে না, আপনি কেবল বৈশিষ্ট্য ফাইল তৈরি করুন এবং এটি দিয়ে এক্সিকিউটেবলকে খাওয়ান। দস্তাবেজগুলি পড়ুন: nlp.stanford.edu/software/corenlp.shtml
জিন্দ্র হেল্ক

24

আমি এই স্নোবল ডেমো সাইটে আপনার পদগুলির তালিকাটি চেষ্টা করেছি এবং ফলাফলগুলি দেখতে ঠিক আছে ....

  • বিড়াল -> বিড়াল
  • চলমান -> চালান
  • দৌড়ে -> দৌড়ে গেল
  • ক্যাকটাস -> ক্যাকটাস
  • ক্যাকটাস -> ক্যাকটাস
  • সম্প্রদায় -> সম্প্রদায়
  • সম্প্রদায় -> সম্প্রদায়

একটি স্টিমার শব্দের সংক্রামিত ফর্মগুলি কিছু সাধারণ রুটে পরিণত করার কথা। মূলটিকে একটি 'যথাযথ' অভিধান শব্দ বানানো কোনও স্টেমারের কাজ নয়। তার জন্য আপনাকে মোড়ফোলজিকাল / অরথোগ্রাফিক বিশ্লেষকগুলির দিকে তাকাতে হবে ।

আমি মনে করি এই প্রশ্নটি কমবেশি একই জিনিস এবং ক্যারেলের সেই প্রশ্নের উত্তরটিই আমি দ্বিতীয় লিঙ্কটি কোথা থেকে নিয়েছি।



1
সফটওয়্যারটি স্টেম (এক্স) == স্টেম (y) করতে পারে তবে এটি প্রশ্নের সম্পূর্ণ উত্তর দিচ্ছে না
ব্যবহারকারী

11
লিঙ্গোর সাথে যত্নশীল, একটি স্টেম শব্দের মূল ফর্ম নয়। যদি আপনি একটি বেস ফর্ম চান, আপনার একটি লেম্যাটাইজার দরকার। কান্ড একটি শব্দের বৃহত্তম অংশ যার মধ্যে উপসর্গ বা প্রত্যয় থাকে না। একটি শব্দ আপডেটের স্টেমটি আসলে "আপডেটেট" at শব্দগুলি ডাঁটা থেকে শেষ এবং প্রত্যয় যুক্ত করে তৈরি করা হয়েছে, যেমন আপডেটাট-ই, বা আপডেট-ইনিং। ( En.wikipedia.org/wiki/Word_stem )
Jindra Helcl

20

স্টেমার বনাম লেম্যাটাইজার বিতর্কগুলি চলছে। দক্ষতার চেয়ে যথার্থতা পছন্দ করার বিষয়টি এটি। আপনার ভাষাগতভাবে অর্থবহ ইউনিটগুলি অর্জন করতে এবং স্তম্ভকে ন্যূনতম কম্পিউটিংয়ের রস ব্যবহার করতে হবে এবং এখনও একটি শব্দ এবং তার মূল প্রকরণগুলি একই কী এর অধীনে সূচী করা উচিত।

দেখুন Stemmers বনাম Lemmatizers

পাইথন এনএলটিকে দিয়ে এখানে একটি উদাহরণ রয়েছে:

>>> sent = "cats running ran cactus cactuses cacti community communities"
>>> from nltk.stem import PorterStemmer, WordNetLemmatizer
>>>
>>> port = PorterStemmer()
>>> " ".join([port.stem(i) for i in sent.split()])
'cat run ran cactu cactus cacti commun commun'
>>>
>>> wnl = WordNetLemmatizer()
>>> " ".join([wnl.lemmatize(i) for i in sent.split()])
'cat running ran cactus cactus cactus community community'

3
আগেই বলা হয়েছে WordNetLemmatizer'র lemmatize()একটি পিওএস ট্যাগ সময় লাগতে পারে। সুতরাং আপনার উদাহরণ থেকে: " ".join([wnl.lemmatize(i, pos=VERB) for i in sent.split()])দেয় 'cat run run cactus cactuses cacti community communities'
নিক রুইজ

@ নিকরুইজ, আমার মনে হয় আপনি বোঝাতে চেয়েছেন pos=NOUN? বিটিডাব্লু: অনেক দিন দেখা হচ্ছে না, আশা করি আমরা শীঘ্রই সম্মেলনে একে অপরের সাথে দেখা করব =)
আলভাস

আসলে, না (যদিও আশা করি সম্মেলনে 'হ্যাঁ', যদিও)। কারণ আপনি যদি সেট করে থাকেন তবে pos=VERBকেবল ক্রিয়াপদে ল্যামিটাইজেশন করবেন। বিশেষ্যগুলি একই থাকে। প্রতিটি টোকনে সঠিক লেমাইটিজেশন প্রয়োগ করার জন্য আমাকে আসল পেন ট্রিব্যাঙ্ক পোস ট্যাগের চারপাশে পিভটকে নিজের কিছু কোড লিখতে হয়েছিল। এছাড়াও, WordNetLemmatizerলেলম্যাটাইজিং এনল্টকের ডিফল্ট টোকনাইজারে দুর্গন্ধ। সুতরাং উদাহরণগুলি does n'tএলোম্যাটি করবেন না do not
নিক রুইজ

তবে, কিন্তু port.stem("this")উত্পাদন করে thiএবং port.stem("was") waএমনকি যখন প্রতিটিটির জন্য সঠিক পোস্ট সরবরাহ করা হয়।
লারনার জাং

একটি স্টিমার ভাষাতাত্ত্বিকভাবে সাউন্ড আউটপুটগুলি ফিরিয়ে দেয় না। এটি কেবল পাঠ্যটিকে আরও "ঘন" করা (যেমন কম ভোকাব ধারণ করে)। দেখুন stackoverflow.com/questions/17317418/stemmers-vs-lemmatizers এবং stackoverflow.com/questions/51943811/...
alvas

8

মার্টিন পোর্টারের অফিসিয়াল পৃষ্ঠায় পিএইচপি-র পাশাপাশি অন্যান্য ভাষার একটি পোর্টার স্টেমার রয়েছে ।

আপনি যদি ভাল স্টেমিংয়ের বিষয়ে সত্যই গুরুতর হন তবে আপনার পোর্টার অ্যালগরিদমের মতো কিছু শুরু করার দরকার থাকলে আপনার ডেটাশেটের ক্ষেত্রে সাধারণ ভুল কেসগুলি ঠিক করার জন্য বিধি যুক্ত করে এটি পরিমার্জন করুন এবং শেষ পর্যন্ত নিয়মগুলিতে প্রচুর ব্যতিক্রম যুক্ত করুন । এটি কী / মান জোড়া (ডিবিএম / হ্যাশ / অভিধান) দিয়ে সহজেই প্রয়োগ করা যেতে পারে যেখানে মূলটি অনুসন্ধান করার শব্দ এবং মানটি মূলটি প্রতিস্থাপনের জন্য স্টেম্ম শব্দ। আমি যে ব্যবসায়িক সার্চ ইঞ্জিনটিতে একবার কাজ করেছিলাম তা একবার পরিবর্তিত পোর্টার অ্যালগরিদমের 800 ব্যতিক্রম সহ শেষ হয়েছিল।


একটি আদর্শ সমাধান স্বয়ংক্রিয়ভাবে এই প্রত্যাশাগুলি শিখতে পারে। আপনি যেমন একটি সিস্টেমের সাথে কোন অভিজ্ঞতা আছে?
ম্যালকম

না। আমাদের ক্ষেত্রে যে ডকুমেন্টগুলি সূচিত করা হচ্ছে তা আইনের একটি নির্দিষ্ট ক্ষেত্রের জন্য কোড এবং নিয়ম ছিল এবং সেখানে কয়েক ডজন (মানব) সম্পাদক ছিল যে কোনও খারাপ কান্ডের জন্য সূচকগুলি বিশ্লেষণ করেছিল।
ভ্যান গালে

5

http://wordnet.princeton.edu/man/morph.3WN

আমার বেশিরভাগ প্রকল্পের জন্য, আমি আরও আক্রমণাত্মক পোর্টার স্টেমিংয়ের চেয়ে লেসিকন ভিত্তিক ওয়ার্ডনেট লেম্যাটাইজারকে পছন্দ করি।

http://wordnet.princeton.edu/links#PHP এর ডাব্লুএন এপিআইএলগুলির সাথে একটি পিএইচপি ইন্টারফেসের লিঙ্ক রয়েছে।


5

স্ট্যাক ওভারফ্লো এবং আমি যে ব্লগগুলি পেরিয়ে এসেছি তার উপর ভিত্তি করে, আমি এই পদ্ধতিটি ব্যবহার করছি এবং এটি আসল শব্দগুলি বেশ ভালভাবে ফিরে আসে বলে মনে হচ্ছে। ধারণাটি হ'ল আগত পাঠ্যগুলিকে শব্দের একটি অ্যারে বিভক্ত করুন (আপনি যে কোনও পদ্ধতি ব্যবহার করুন) এবং তারপরে এই শব্দের জন্য বক্তৃতার অংশগুলি (পিওএস) সন্ধান করুন এবং এটি শব্দটিকে স্টেম এবং লেম্যাটাইজ করতে সহায়তা করুন।

আপনি উপরে নমুনা খুব ভাল কাজ করে না, কারণ POS নির্ধারণ করা যায় না। তবে, আমরা যদি সত্যিকারের বাক্যটি ব্যবহার করি তবে বিষয়গুলি আরও ভাল কাজ করে।

import nltk
from nltk.corpus import wordnet

lmtzr = nltk.WordNetLemmatizer().lemmatize


def get_wordnet_pos(treebank_tag):
    if treebank_tag.startswith('J'):
        return wordnet.ADJ
    elif treebank_tag.startswith('V'):
        return wordnet.VERB
    elif treebank_tag.startswith('N'):
        return wordnet.NOUN
    elif treebank_tag.startswith('R'):
        return wordnet.ADV
    else:
        return wordnet.NOUN


def normalize_text(text):
    word_pos = nltk.pos_tag(nltk.word_tokenize(text))
    lemm_words = [lmtzr(sw[0], get_wordnet_pos(sw[1])) for sw in word_pos]

    return [x.lower() for x in lemm_words]

print(normalize_text('cats running ran cactus cactuses cacti community communities'))
# ['cat', 'run', 'ran', 'cactus', 'cactuses', 'cacti', 'community', 'community']

print(normalize_text('The cactus ran to the community to see the cats running around cacti between communities.'))
# ['the', 'cactus', 'run', 'to', 'the', 'community', 'to', 'see', 'the', 'cat', 'run', 'around', 'cactus', 'between', 'community', '.']


2

এটি আকর্ষণীয় দেখায়: এমআইটি জাভা ওয়ার্ডনেটসটেমার: http://projects.csail.mit.edu/jwi/api/edu/mit/jwi/morph/WordnetStemmer.html


3
এসও তে আপনাকে স্বাগতম, এবং আপনার পোস্টের জন্য ধন্যবাদ, +1। আপনি যদি এই স্টেমারের ব্যবহার, পারফরম্যান্স ইত্যাদি সম্পর্কে কয়েকটি মন্তব্য করতে পারেন তবে দুর্দান্ত হবে Just শুধু একটি লিঙ্ক সাধারণত খুব ভাল উত্তর হিসাবে বিবেচিত হয় না।
jogojapan

2

কটাক্ষপাত LemmaGen সি # 3.0 লেখা ওপেন সোর্স লাইব্রেরি -।

আপনার পরীক্ষার শব্দের ফলাফল ( http://lemmatise.ijs.si/Services )

  • বিড়াল -> বিড়াল
  • চলমান
  • দৌড় -> রান
  • ফণীমনসা
  • ক্যাকটাস -> ক্যাকটাস
  • ক্যাকটি -> ক্যাকটাস
  • সম্প্রদায়
  • সম্প্রদায় -> সম্প্রদায়

2

শীর্ষ পাইথন প্যাকেজ (কোন নির্দিষ্ট অনুক্রমে) lemmatization জন্য আছেন: spacy, nltk, gensim, pattern, CoreNLPএবং TextBlob। আমি স্পাইসি এবং জিনসিমের প্রয়োগকে পছন্দ করি (প্যাটার্নের ভিত্তিতে) কারণ তারা শব্দের পস ট্যাগ সনাক্ত করে এবং যথাযথ লেমাকে স্বয়ংক্রিয়ভাবে নির্ধারিত করে। অর্থটি অক্ষত রেখে আরও প্রাসঙ্গিক লেমাস দেয়।

আপনি যদি nltk বা টেক্সটব্লব ব্যবহারের পরিকল্পনা করেন তবে আপনাকে সঠিকভাবে পস ট্যাগটি ম্যানুয়ালি এবং সঠিক লেমা খুঁজে বের করার যত্ন নেওয়া উচিত।

SpaCy সহ লেম্যাটাইজেশন উদাহরণ:

# Run below statements in terminal once. 
pip install spacy
spacy download en

import spacy

# Initialize spacy 'en' model
nlp = spacy.load('en', disable=['parser', 'ner'])

sentence = "The striped bats are hanging on their feet for best"

# Parse
doc = nlp(sentence)

# Extract the lemma
" ".join([token.lemma_ for token in doc])
#> 'the strip bat be hang on -PRON- foot for good'

জেনসিমের সাথে লেম্যাটাইজেশন উদাহরণ:

from gensim.utils import lemmatize
sentence = "The striped bats were hanging on their feet and ate best fishes"
lemmatized_out = [wd.decode('utf-8').split('/')[0] for wd in lemmatize(sentence)]
#> ['striped', 'bat', 'be', 'hang', 'foot', 'eat', 'best', 'fish']

উপরোক্ত উদাহরণগুলি এই লেম্যাটাইজেশন পৃষ্ঠাতে ধার করা হয়েছিল ।


1

Lucene অনুসন্ধান করুন, পিএইচপি পোর্ট রয়েছে কিনা তা আমি নিশ্চিত নই তবে আমি জানি লুসিন অনেক প্ল্যাটফর্মের জন্য উপলব্ধ। Lucene একটি ওএসএস (অ্যাপাচি থেকে) ইনডেক্সিং এবং অনুসন্ধান লাইব্রেরি। স্বাভাবিকভাবেই এটি এবং সম্প্রদায়ে অতিরিক্তগুলি দেখতে আকর্ষণীয় কিছু থাকতে পারে। খুব কমপক্ষে আপনি শিখতে পারেন এটি কীভাবে এটি একটি ভাষায় হয়েছে যাতে আপনি "ধারণা "টিকে পিএইচপি-তে অনুবাদ করতে পারেন


1

আমি যদি স্টম্পচিকেন উল্লেখ করা প্রশ্নের উত্তরটি উত্তর দিতে পারি:

এখানে মূল বিষয়টি হ'ল স্টেমিং অ্যালগরিদমগুলি ফোনেটিক ভিত্তিতে কাজ করে তারা যে ভাষার সাথে কাজ করছে তার কোন প্রকৃত উপলব্ধি নেই।

যেহেতু তারা ভাষা সম্পর্কে কোনও উপলব্ধি করতে পারে না এবং শব্দের একটি অভিধান থেকে চালিত হয় না, তাই তাদের "অনিয়মিত" / "দৌড়" এর মতো অনিয়মিত ক্ষেত্রে যথাযথভাবে স্বীকৃতি জানাতে এবং তাদের প্রতিক্রিয়া জানার কোনও উপায় নেই।

আপনার যদি অনিয়মিত কেসগুলি পরিচালনা করতে হয় তবে স্টেমারটি কাজটি সম্পাদন করার পরে চালানোর জন্য আপনাকে আলাদা পদ্ধতি বেছে নিতে হবে বা আপনার নিজস্ব কাস্টম সংশোধন সংক্রান্ত অভিধানটি বাড়াতে হবে।



1

আপনি মরফা স্টেমার ব্যবহার করতে পারেন। আপনি যদি জাভা অ্যাপ্লিকেশন থেকে এটি ব্যবহার করার পরিকল্পনা করেন তবে ইউডাব্লুটি মভাভেন সেন্ট্রালটিতে মরফা স্টেমার আপলোড করেছে । এমন একটি মোড়ক রয়েছে যা এটি ব্যবহার করা আরও সহজ করে তোলে। আপনাকে কেবল এটি নির্ভরতা হিসাবে যুক্ত করতে এবং edu.washington.cs.knowitall.morpha.MorphaStemmerশ্রেণিটি ব্যবহার করতে হবে । উদাহরণ থ্রেডসেফ (মূল জেএফ্লেক্সের অকারণে স্থানীয় ভেরিয়েবলের ক্লাস ফিল্ড ছিল)। একটি শ্রেণী ইনস্টল করুন এবং রান করুন morphaএবং আপনি যে শব্দটি স্টেম করতে চান।

new MorphaStemmer().morpha("climbed") // goes to "climb"

0

। নেট লুসিনে একটি ইনবিল্ট পোর্টার স্টেমার রয়েছে। আপনি এটি চেষ্টা করতে পারেন। তবে নোট করুন যে পোর্টার স্টেমিং লেমাটি প্রাপ্ত করার সময় শব্দের প্রসঙ্গ বিবেচনা করে না। (অ্যালগরিদম এবং এর বাস্তবায়নের মধ্য দিয়ে যান এবং এটি কীভাবে কাজ করে তা আপনি দেখতে পাবেন)


0

মার্টিন পোর্টার স্নোবল লিখেছিলেন (অ্যালগোরিদম স্টেমিংয়ের একটি ভাষা) এবং স্নোবলে "ইংলিশ স্টেমার" পুনরায় লিখেছিলেন। সি এবং জাভা জন্য একটি ইংরেজী স্টেমার আছে।

তিনি স্পষ্টতই বলেছিলেন যে পোর্টার স্টেমারকে কেবল historical তিহাসিক কারণে পুনরায় প্রয়োগ করা হয়েছে , সুতরাং পোর্টার স্টেমারের বিরুদ্ধে স্টেম্মিংয়ের যথার্থতা পরীক্ষা করার ফলে আপনি (ইতিমধ্যে) জানা থাকা ফলাফল পাবেন।

থেকে http://tartarus.org/~martin/PorterStemmer/index.html (জোর খনি)

পোর্টার স্টেমারটিকে ' হিমায়িত ' হিসাবে বিবেচনা করা উচিত , এটি কঠোরভাবে সংজ্ঞায়িত করা হয়েছে, এবং আরও সংশোধন করার পক্ষে উপযুক্ত নয়। স্টিমার হিসাবে এটি স্নোবল ইংলিশ বা পোর্টার 2 স্টেমারের চেয়ে কিছুটা নিকৃষ্ট, যা এটি থেকে উদ্ভূত হয় এবং যা মাঝে মাঝে উন্নতির শিকার হয়। ব্যবহারিক কাজের জন্য, সুতরাং নতুন স্নোবল স্টেমারটি সুপারিশ করা হয়। পোর্টার স্টেমার স্টেমিং জড়িত আইআর গবেষণা কাজের জন্য উপযুক্ত যেখানে পরীক্ষাগুলি ঠিক পুনরাবৃত্তিযোগ্য হওয়া দরকার।

ডাঃ পোর্টার পোর্টার স্টেমারের পরিবর্তে ইংলিশ বা পোর্টার 2 স্টেমার ব্যবহার করার পরামর্শ দেন। ইংলিশ স্টিমারটি ডেমো সাইটে প্রকৃতপক্ষে যা ব্যবহার করা হয়েছে সেহেতু @ স্টম্পচিকেন এর আগে উত্তর দিয়েছে।


0

জাভাতে, আমি স্টার্মিং শব্দের জন্য টারটার্গাস-স্নোবল ব্যবহার করি

ম্যাভেন:

<dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-snowball</artifactId>
        <version>3.0.3</version>
        <scope>test</scope>
</dependency>

কোডের উদাহরণ:

SnowballProgram stemmer = new EnglishStemmer();
String[] words = new String[]{
    "testing",
    "skincare",
    "eyecare",
    "eye",
    "worked",
    "read"
};
for (String word : words) {
    stemmer.setCurrent(word);
    stemmer.stem();
    //debug
    logger.info("Origin: " + word + " > " + stemmer.getCurrent());// result: test, skincar, eyecar, eye, work, read
}

0

এখানে এটি ব্যবহার করে দেখুন: http://www.twinword.com/lemmatizer.php

আমি ডেমোতে আপনার জিজ্ঞাসাটি প্রবেশ "cats running ran cactus cactuses cacti community communities"করিয়েছি এবং option ["cat", "running", "run", "cactus", "cactus", "cactus", "community", "community"]চ্ছিক পতাকাটি পেয়েছি ALL_TOKENS

কোডের উদাহরণ

এটি একটি এপিআই যাতে আপনি যে কোনও পরিবেশ থেকে এটিতে সংযোগ রাখতে পারেন। এখানে পিএইচপি REST কলটি দেখতে দেখতে পারে।

// These code snippets use an open-source library. http://unirest.io/php
$response = Unirest\Request::post([ENDPOINT],
  array(
    "X-Mashape-Key" => [API KEY],
    "Content-Type" => "application/x-www-form-urlencoded",
    "Accept" => "application/json"
  ),
  array(
    "text" => "cats running ran cactus cactuses cacti community communities"
  )
);

0

আমি স্পেসি (বেস টেক্সট পার্সিং এবং ট্যাগিং) এবং টেক্সটেসি ব্যবহারের সুপারিশ করছি (স্পেসির শীর্ষে নির্মিত উচ্চ স্তরের পাঠ্য প্রক্রিয়াজাতকরণ ।

টোকেনের অ্যাট্রিবিউট হিসাবে স্প্যাসিতে লেমমেটাইজড শব্দগুলি ডিফল্টরূপে উপলব্ধ.lemma_ and উদাহরণস্বরূপ শর্তাদি বা শব্দের ব্যাগ তৈরি করার সময় বা সাধারণত কিছু প্রক্রিয়াজাতকরণের আগে যা প্রয়োজন হয়।

আমি আপনাকে কোনও কোড লেখার আগে উভয়ই পরীক্ষা করে নিতে উত্সাহিত করব, কারণ এটি আপনাকে অনেক সময় বাঁচাতে পারে!


-1
df_plots = pd.read_excel("Plot Summary.xlsx", index_col = 0)
df_plots
# Printing first sentence of first row and last sentence of last row
nltk.sent_tokenize(df_plots.loc[1].Plot)[0] + nltk.sent_tokenize(df_plots.loc[len(df)].Plot)[-1]

# Calculating length of all plots by words
df_plots["Length"] = df_plots.Plot.apply(lambda x : 
len(nltk.word_tokenize(x)))

print("Longest plot is for season"),
print(df_plots.Length.idxmax())

print("Shortest plot is for season"),
print(df_plots.Length.idxmin())



#What is this show about? (What are the top 3 words used , excluding the #stop words, in all the #seasons combined)

word_sample = list(["struggled", "died"])
word_list = nltk.pos_tag(word_sample)
[wnl.lemmatize(str(word_list[index][0]), pos = word_list[index][1][0].lower()) for index in range(len(word_list))]

# Figure out the stop words
stop = (stopwords.words('english'))

# Tokenize all the plots
df_plots["Tokenized"] = df_plots.Plot.apply(lambda x : nltk.word_tokenize(x.lower()))

# Remove the stop words
df_plots["Filtered"] = df_plots.Tokenized.apply(lambda x : (word for word in x if word not in stop))

# Lemmatize each word
wnl = WordNetLemmatizer()
df_plots["POS"] = df_plots.Filtered.apply(lambda x : nltk.pos_tag(list(x)))
# df_plots["POS"] = df_plots.POS.apply(lambda x : ((word[1] = word[1][0] for word in word_list) for word_list in x))
df_plots["Lemmatized"] = df_plots.POS.apply(lambda x : (wnl.lemmatize(x[index][0], pos = str(x[index][1][0]).lower()) for index in range(len(list(x)))))



#Which Season had the highest screenplay of "Jesse" compared to "Walt" 
#Screenplay of Jesse =(Occurences of "Jesse")/(Occurences of "Jesse"+ #Occurences of "Walt")

df_plots.groupby("Season").Tokenized.sum()

df_plots["Share"] = df_plots.groupby("Season").Tokenized.sum().apply(lambda x : float(x.count("jesse") * 100)/float(x.count("jesse") + x.count("walter") + x.count("walt")))

print("The highest times Jesse was mentioned compared to Walter/Walt was in season"),
print(df_plots["Share"].idxmax())
#float(df_plots.Tokenized.sum().count('jesse')) * 100 / #float((df_plots.Tokenized.sum().count('jesse') + #df_plots.Tokenized.sum().count('walt') + #df_plots.Tokenized.sum().count('walter')))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.