পাইথনের সাথে কোনও শব্দ ইংরেজি শব্দ কিনা তা কীভাবে পরীক্ষা করবেন?


134

ইংরেজী অভিধানে যদি একটি শব্দ থাকে তবে আমি পাইথন প্রোগ্রামটি পরীক্ষা করতে চাই।

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

def is_english_word(word):
    pass # how to I implement is_english_word?

is_english_word(token.lower())

ভবিষ্যতে, আমি কোনও শব্দটির একক রূপটি অভিধানে রয়েছে কিনা তা পরীক্ষা করতে চাই (যেমন, বৈশিষ্ট্য -> সম্পত্তি -> ইংরেজী শব্দ)। আমি কীভাবে এটি অর্জন করব?

উত্তর:


215

(অনেক বেশি) শক্তি এবং নমনীয়তার জন্য, একটি ডেডিকেটেড বানান পরীক্ষা করার লাইব্রেরি ব্যবহার করুন PyEnchant। এখানে একটি টিউটোরিয়াল রয়েছে , বা আপনি সরাসরি ডুব দিতে পারেন:

>>> import enchant
>>> d = enchant.Dict("en_US")
>>> d.check("Hello")
True
>>> d.check("Helo")
False
>>> d.suggest("Helo")
['He lo', 'He-lo', 'Hello', 'Helot', 'Help', 'Halo', 'Hell', 'Held', 'Helm', 'Hero', "He'll"]
>>>

PyEnchantকয়েকটি অভিধান (এন_জিবি, এন_ ইউএস, ডি_ডিই, ফ্র_এফআর) নিয়ে আসে তবে আপনি আরও ভাষা চাইলে ওপেন অফিসের যে কোনওটি ব্যবহার করতে পারেন ।

সেখানে বহুবচন লাইব্রেরি বলে মনে হচ্ছে inflect, তবে এটি কোনও ভাল কিনা তা আমার কোনও ধারণা নেই।


2
আপনাকে ধন্যবাদ, পাই পাইচেন্ট সম্পর্কে আমি জানতাম না এবং আমি যে ধরণের চেকগুলি করতে চাই তার পক্ষে এটি অনেক বেশি কার্যকর।
বার্থলেমি

এটি <হ্যালো> চিনতে পারে না? একটি সাধারণ শব্দ নয়, তবে আমি <হ্যালো> <হেলিকপ্টার> এর সংক্ষিপ্ত রূপ হিসাবে জানি এবং আমি <হেলোট> জানি না। কেবল এটিই নির্দেশ করতে চেয়েছিলেন যে সমাধানটি এক-আকারের-ফিট হয় না-এবং কোনও ভিন্ন প্রকল্পের জন্য সম্পূর্ণ অভিধানে বিভিন্ন অভিধান বা আলাদা পদ্ধতির প্রয়োজন হতে পারে।
dmh

15
প্যাকেজটি আমার পক্ষে ইনস্টল করা মূলত অসম্ভব। দুর্দান্ত হতাশাবোধ।
মনিকা হেডনেক

9
উইন্ডোতে অজগর bit৪ বিটের
রিকি বয়েস

9
পাইচ্যান্ট আর রক্ষণাবেক্ষণ করা হয় না। পাইহনস্পেলের আরও সাম্প্রতিক ক্রিয়াকলাপ রয়েছে। এছাড়াও /usr/share/dict/এবং /var/lib/dict* নিক্স সেটআপগুলিতে উল্লেখ করা যেতে পারে।
pkfm

48

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

>>> from nltk.corpus import words
>>> "would" in words.words()
True
>>> "could" in words.words()
True
>>> "should" in words.words()
True
>>> "I" in words.words()
True
>>> "you" in words.words()
True

5
একই উল্লেখ এখানেও প্রযোজ্য: একটি সেটে রূপান্তরিত হওয়ার পরে অনেক দ্রুত:set(words.words())
আইলিয়াস কর্ট

যথাযথ ফলাফল পেতে আপনাকে শব্দগুলি একক করতে হবে বলে দেখুন
ফামারগার

2
সাবধানতা: পাস্তা বা বার্গারের মতো শব্দগুলি এই তালিকায় পাওয়া যায় না
পারোকস সাক্সেনা

45

এনএলটিকে ব্যবহার :

from nltk.corpus import wordnet

if not wordnet.synsets(word_to_test):
  #Not an English Word
else:
  #English Word

আপনার যদি ওয়ার্ডনেট ইনস্টল করতে সমস্যা হয় বা অন্য পদ্ধতির চেষ্টা করতে চান তবে আপনার এই নিবন্ধটি উল্লেখ করা উচিত ।


2
এটি সাইগউইন ব্যবহারকারীদের জন্য বিশেষত কার্যকর কারণ জাদুকর ইনস্টল করা বেশ সমস্যাযুক্ত।
আলেহরো

27
ওয়ার্ডনেট ইংরেজিতে প্রতিটি শব্দ ধারণ করে না, এতে কেবল এটির একটি ছোট উপসর্গ থাকে।
justhalf

2
ওয়ার্ডনেটের শীর্ষে 'কী' এবং 'কীভাবে' এর মতো প্রচুর প্রচলিত শব্দ অনুপস্থিত তা কিন্ডালের সমাধানের চেয়ে লক্ষণীয়ভাবে ধীর।
রায়ান এপ্প

3
তদ্ব্যতীত, wordnet.synsets কেবল কোনও শব্দ এতে আছে কিনা তা পরীক্ষা করে না। এটি প্রথমে লেমাইজ করার চেষ্টা করে। সুতরাং এটি "সাসলেস" (সত্যিকারের ইংরেজি শব্দ নয়) "বিক্রয়" তে রূপান্তর করে।
লিন্ডন হোয়াইট

সিনেটস কীভাবে কাজ করে তা বিবেচনা করে এটি করার একটি ত্রুটিযুক্ত পদ্ধতি। আমি কী বলছি তা দেখতে 'টিল্টস' রাখুন
রেট্রো কোড

37

শব্দের তালিকাগুলি সঞ্চয় করার জন্য একটি সেট ব্যবহার করা কারণ সেগুলি সন্ধান করা দ্রুত হবে:

with open("english_words.txt") as word_file:
    english_words = set(word.strip().lower() for word in word_file)

def is_english_word(word):
    return word.lower() in english_words

print is_english_word("ham")  # should be true if you have a good english_words.txt

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

ইংরাজির শব্দের তালিকাগুলি কোথায় পাবেন, আমি গুগলিংয়ের "ইংলিশ শব্দ তালিকার" দ্বারা বেশ কয়েকটি পেয়েছি। এখানে একটি হ'ল: http://www.sil.org/linguistic/wordlists/english/wordlist/wordsEn.txt আপনি যদি ব্রিটিশ বা আমেরিকান ইংরেজির জন্য গুগল করতে পারেন তবে আপনি বিশেষত সেই উপভাষাগুলির মধ্যে একটি চান want


9
আপনি যদি english_wordsএকটি এর setপরিবর্তে একটি তৈরি করেন list, তবে is_english_wordঅনেক দ্রুত চলবে।
dan04

আমি আসলে এটি ডিক হিসাবে আবার redid করেছি তবে আপনি ঠিক বলেছেন, একটি সেট আরও ভাল। আপডেট করা হয়েছে।
শে

1
আপনি খাঁজও করতে পারেন .xreadlines()এবং কেবল পুনরাবৃত্তি করতে পারেন word_file
ফোগলবার্ড

3
উবুন্টু প্যাকেজগুলির অধীনে wamericanএবং wbritishআমেরিকান এবং ব্রিটিশ ইংরেজি শব্দ তালিকাগুলি সরবরাহ করুন /usr/share/dict/*-english। প্যাকেজ তথ্য ওয়ার্ডলিস্ট.সোর্সforge.net একটি রেফারেন্স হিসাবে দেয় ।
intuited

1
আমি একটি গিটহাবের সংগ্রহস্থল পেয়েছি যাতে 479 কে ইংরেজি শব্দ রয়েছে।
হাওলি

6

একটি দ্রুততর এনএলটিকে-ভিত্তিক সমাধানের জন্য আপনি রৈখিক অনুসন্ধান এড়াতে শব্দের সেট হ্যাশ করতে পারেন।

from nltk.corpus import words as nltk_words
def is_english_word(word):
    # creation of this dictionary would be done outside of 
    #     the function because you only need to do it once.
    dictionary = dict.fromkeys(nltk_words.words(), None)
    try:
        x = dictionary[word]
        return True
    except KeyError:
        return False

2
অভিধানের পরিবর্তে একটি সেট ব্যবহার করুন
ঝুয়াং

4

আমি দেখতে পাচ্ছি যে সমস্যাটি সমাধানের জন্য 3 টি প্যাকেজ ভিত্তিক সমাধান রয়েছে। এগুলি পাইঞ্চ্যান্ট, ওয়ার্ডনেট এবং কর্পাস (স্ব-সংজ্ঞায়িত বা এনটিএলকে থেকে)। পিয়্যানচ্যান্ট উইন 64 এ পাই 3 দিয়ে সহজেই ইনস্টল করতে পারেনি । ওয়ার্ডনেট খুব ভাল কাজ করে না কারণ এটি কর্পস সম্পূর্ণ হয়নি। সুতরাং আমার জন্য, আমি @ সাদিকের উত্তরের সমাধানটি বেছে নিয়েছি এবং গতি বাড়ানোর জন্য 'সেট (ਸ਼ਬਦ.ওয়ার্ডস ()) ব্যবহার করি।

প্রথম:

pip3 install nltk
python3

import nltk
nltk.download('words')

তারপর:

from nltk.corpus import words
setofwords = set(words.words())

print("hello" in setofwords)
>>True

3

PyEchacha.checker বানান চেকার সহ:

from enchant.checker import SpellChecker

def is_in_english(quote):
    d = SpellChecker("en_US")
    d.set_text(quote)
    errors = [err.word for err in d]
    return False if ((len(errors) > 4) or len(quote.split()) < 3) else True

print(is_in_english('“办理美国加州州立大学圣贝纳迪诺分校高仿成绩单Q/V2166384296加州州立大学圣贝纳迪诺分校学历学位认证'))
print(is_in_english('“Two things are infinite: the universe and human stupidity; and I\'m not sure about the universe.”'))

> False
> True

1
পাঠ্যটি 3 টি শব্দের চেয়ে দীর্ঘ এবং 4 টিরও কম ত্রুটি (অ-স্বীকৃত শব্দ) থাকলে এটি সত্য হবে। আমার ব্যবহারের ক্ষেত্রে সাধারণভাবে সেই সেটিংসটি বেশ ভাল কাজ করে।
গ্রিজমিন

1

শব্দার্থক ওয়েব পদ্ধতির জন্য, আপনি আরডিএফ ফর্ম্যাটে ওয়ার্ডনেটের বিরুদ্ধে একটি স্পার্কল কোয়েরি চালাতে পারেন । মূলত জেট অনুরোধ জারির জন্য urllib মডিউলটি ব্যবহার করুন এবং জেএসওএন ফর্ম্যাটে ফলাফলগুলি ফেরান, পাইথন 'জেসন' মডিউলটি ব্যবহার করে পার্স করুন। যদি এটি ইংরেজি শব্দ না হয় তবে আপনি কোনও ফল পাবেন না।

অন্য একটি ধারণা হিসাবে, আপনি উইকশনারি এর এপিআই জিজ্ঞাসা করতে পারেন ।


1

সমস্ত লিনাক্স / ইউনিক্স ব্যবহারকারীদের জন্য

যদি আপনার ওএস লিনাক্স কার্নেলটি ব্যবহার করে তবে ইংরেজি / আমেরিকান অভিধান থেকে সমস্ত শব্দ পাওয়ার সহজ উপায় রয়েছে। ডিরেক্টরিতে /usr/share/dictআপনার একটি wordsফাইল রয়েছে। আরও একটি নির্দিষ্ট american-englishএবং british-englishফাইল আছে। এগুলিতে সেই নির্দিষ্ট ভাষার সমস্ত শব্দ রয়েছে। আপনি প্রতিটি প্রোগ্রামিং ভাষা জুড়ে এটি অ্যাক্সেস করতে পারেন যার কারণে আমি ভেবেছিলাম আপনি এই সম্পর্কে জানতে চাইতে পারেন।

পাইথন নির্দিষ্ট ব্যবহারকারীদের জন্য, নীচে পাইথন কোডটি প্রতিটি শব্দটির মান রাখতে তালিকার শব্দগুলি নির্ধারণ করে:

import re
file = open("/usr/share/dict/words", "r")
words = re.sub("[^\w]", " ",  file.read()).split()

def is_word(word):
    return word.lower() in words

is_word("tarts") ## Returns true
is_word("jwiefjiojrfiorj") ## Returns False

আশাকরি এটা সাহায্য করবে!!!

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