अगर पायथन के साथ एक शब्द अंग्रेजी शब्द है तो कैसे जांचें?


134

मैं एक पायथन कार्यक्रम में जाँच करना चाहता हूँ कि क्या कोई शब्द अंग्रेज़ी शब्दकोश में है।

मेरा मानना ​​है कि nltk wordnet इंटरफ़ेस जाने का तरीका हो सकता है, लेकिन मुझे कोई सुराग नहीं है कि इस तरह के एक सरल कार्य के लिए इसका उपयोग कैसे करें।

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कुछ शब्दकोशों (en_GB, en_US, de_DE, fr_FR) के साथ आता है, लेकिन यदि आप अधिक भाषाएँ चाहते हैं तो किसी भी OpenOffice का उपयोग कर सकते हैं।

वहाँ एक बहुवचन पुस्तकालय कहा जाता है inflect, लेकिन मुझे नहीं पता कि यह किसी भी अच्छा है।


2
धन्यवाद, मैं PyEnchant के बारे में नहीं जानता था और यह वास्तव में उस तरह के चेक के लिए अधिक उपयोगी है जिसे मैं बनाना चाहता हूं।
बारथेलेमी

यह <helo> नहीं पहचानता है? एक सामान्य शब्द नहीं है, लेकिन मैं <हेलो> <हेलिकॉप्टर> के लिए एक संक्षिप्त नाम के रूप में जानता हूं, और मैं <हेलोट> नहीं जानता। बस यह बताना चाहता था कि समाधान एक आकार-फिट-सभी नहीं है और एक अलग परियोजना के लिए अलग-अलग शब्दकोशों या अलग दृष्टिकोण की आवश्यकता हो सकती है।
dmh

15
पैकेज मूल रूप से मेरे लिए स्थापित करना असंभव है। सुपर निराशा होती है।
मोनिका हेडडेक

9
खिड़कियों पर अजगर 64 बिट के लिए इस समय एंचेंट का समर्थन नहीं किया गया है :( github.com/rfk/pyenchant/issues/42
रिकी बॉयस

9
पाइनकैंट का रखरखाव अब नहीं किया जाता है। pyhunspell में हाल ही की गतिविधि अधिक है। इसके अलावा /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())
Iulius कर्ट

यह देखने के लिए कि आपको उचित परिणाम प्राप्त करने के लिए विलक्षण शब्दों की आवश्यकता है
famargar

2
सावधानी: पास्ता या बर्गर जैसे शब्द इस सूची में नहीं पाए जाते हैं
परोक्ष सक्सेना

45

NLTK का उपयोग करना :

from nltk.corpus import wordnet

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

यदि आपको वर्डनेट को स्थापित करने में समस्या है या अन्य दृष्टिकोणों को आज़माना चाहते हैं तो आपको इस लेख का उल्लेख करना चाहिए ।


2
यह विशेष रूप से साइबर उपयोगकर्ताओं के लिए उपयोगी है क्योंकि जादू की स्थापना काफी समस्याग्रस्त है।
एलेरो

27
वर्डनेट में अंग्रेजी का हर शब्द शामिल नहीं है, इसमें केवल इसका एक छोटा सा उपसमूह है।
जस्टफुल

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/linguistics/wordlists/english/wordlist/wordsEn.txt यदि आप विशेष रूप से उन बोलियों में से एक चाहते हैं तो आप ब्रिटिश या अमेरिकी अंग्रेजी के लिए Google कर सकते हैं।


9
आप करते हैं तो english_wordsएक setएक के बजाय list, तो is_english_wordबहुत तेजी से चलेंगे।
dan04

मैं वास्तव में इसे एक तानाशाह के रूप में फिर से परिभाषित करता हूं, लेकिन आप सही हैं, एक सेट और भी बेहतर है। अपडेट किया गया।
किंडल

1
तुम भी खाई .xreadlines()और बस iterate पर कर सकते हैं word_file
फोगबर्ड

3
Ubuntu के तहत पैकेज wamericanऔर wbritishअमेरिकी और ब्रिटिश अंग्रेजी शब्द सूची प्रदान करते हैं /usr/share/dict/*-english। पैकेज जानकारी एक संदर्भ के रूप में wordlist.sourceforge.net देती है ।
intuited

1
मुझे एक GitHub रिपॉजिटरी मिलती है जिसमें 479k अंग्रेजी शब्द हैं।
होले

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 पैकेज-आधारित समाधान हैं। वे pyenchant, wordnet और corpus (स्व-परिभाषित या ntlk से) हैं। Pyenchant p3 के साथ win64 में आसानी से स्थापित नहीं हो सका । Wordnet बहुत अच्छी तरह से काम नहीं करता है क्योंकि यह कॉर्पस पूर्ण नहीं है। तो मेरे लिए, मैं @Sadik द्वारा उत्तर दिए गए समाधान को चुनता हूं , और गति बढ़ाने के लिए 'सेट (शब्द.शब्द ())' का उपयोग करता हूं।

प्रथम:

pip3 install nltk
python3

import nltk
nltk.download('words')

फिर:

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

print("hello" in setofwords)
>>True

3

PyEnchant.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

सिमेंटिक वेब दृष्टिकोण के लिए, आप वर्डनेट के खिलाफ RDF प्रारूप में एक स्पार्कल क्वेरी चला सकते हैं । मूल रूप से सिर्फ JSON फॉर्मेट जारी करने के लिए urllib मॉड्यूल का उपयोग करें और JSON फॉर्मेट में परिणाम दें, पार्सन 'json' मॉड्यूल का उपयोग करके पार्स करें। यदि यह अंग्रेजी शब्द नहीं है, तो आपको कोई परिणाम नहीं मिलेगा।

एक अन्य विचार के रूप में, आप विक्षनरी के एपीआई को क्वेरी कर सकते हैं ।


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

उम्मीद है की यह मदद करेगा!!!

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