Python ile bir kelimenin İngilizce bir kelime olup olmadığı nasıl kontrol edilir?


134

İngilizce sözlükte bir kelime olup olmadığını kontrol etmek istiyorum bir Python programı.

Nltk wordnet arayüzünün gidecek yol olabileceğine inanıyorum, ancak bu kadar basit bir görev için nasıl kullanılacağına dair hiçbir fikrim yok.

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

is_english_word(token.lower())

Gelecekte, bir kelimenin tekil biçiminin sözlükte olup olmadığını kontrol etmek isteyebilirim (örneğin, özellikler -> özellik -> İngilizce kelime). Bunu nasıl başarabilirim?

Yanıtlar:


215

(Çok) daha fazla güç ve esneklik için, gibi özel bir yazım denetimi kitaplığı kullanın PyEnchant. Bir öğretici var ya da doğrudan dalabilirsiniz:

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

PyEnchantbirkaç sözlükle (en_GB, en_US, de_DE, fr_FR) birlikte gelir, ancak daha fazla dil istiyorsanız OpenOffice olanlardan herhangi birini kullanabilirsiniz .

Adında çoğullaştırma kütüphanesi var gibi görünüyor inflect, ancak bunun iyi olup olmadığı hakkında hiçbir fikrim yok.


2
Teşekkürler, PyEnchant'ı bilmiyordum ve gerçekten yapmak istediğim kontroller için çok daha kullanışlı.
Barthelemy

<helo> tanımıyor mu? Yaygın bir kelime değil, ancak <helo> 'yu <helicopter>' in kısaltması olarak biliyorum ve <Helot> 'u bilmiyorum. Çözümün herkese uyan tek bir çözüm olmadığını ve farklı bir projenin farklı sözlükler veya tamamen farklı bir yaklaşım gerektirebileceğini belirtmek istedim.
dmh

15
Benim için paket kurmak temelde imkansız. Süper sinir bozucu.
Monica Heddneck

9
Enchant şu anda windows üzerinde python 64bit için desteklenmemektedir :( github.com/rfk/pyenchant/issues/42
Ricky Boyce

9
pyenchant artık korunmuyor . pyhunspell'in daha yeni etkinliği var. Ayrıca /usr/share/dict/ve /var/lib/dict* nix kurulumları üzerinde başvuru.
pkfm

48

WordNet ile iyi çalışmaz çünkü WordNet tüm ingilizce kelimeleri içermez. Büyü olmadan NLTK'ya dayanan bir başka olasılık da NLTK'nın sözcükleri külliyatıdır.

>>> 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
Aynı söz burada da geçerlidir: bir sete dönüştürüldüğünde çok daha hızlı:set(words.words())
Iulius Curt

Doğru sonuçları elde etmek için kelimeleri tekilleştirmeniz gerektiğine dikkat edin
famargar

2
dikkat: makarna veya burger gibi kelimeler bu listede bulunamadı
Paroksh Saxena

45

NLTK kullanarak :

from nltk.corpus import wordnet

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

Wordnet'i kurmakta sorun yaşıyorsanız veya diğer yaklaşımları denemek istiyorsanız bu makaleye başvurmalısınız .


2
Özellikle cygwin kullanıcıları için kullanışlıdır çünkü enchant'ın yüklenmesi oldukça sorunludur.
alehro

27
WordNet, İngilizce'deki her kelimeyi içermez, yalnızca küçük bir alt kümesini içerir.
justhalf

2
Wordnet'in yanı sıra, 'olur' ve 'nasıl' gibi bir çok yaygın kelime eksiktir, bu, kindall'ın çözümünden belirgin şekilde daha yavaştır.
Ryan Epp

3
dahası, wordnet.synsets sadece içinde bir kelime olup olmadığını kontrol etmez. Önce lemmatize etmeye çalışır. Yani "saless" kelimesini (gerçek bir ingilizce kelime değil) "satış" a çevirir.
Lyndon White

Bu, synset'lerin nasıl çalıştığını düşünürsek, bunu yapmak için hatalı bir yöntemdir. Ne dediğimi görmek için 'eğimler' koyun
RetroCode

37

Kelime listesini saklamak için bir küme kullanmak, çünkü onları aramak daha hızlı olacaktır:

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

Sorunun ikinci bölümünü yanıtlamak için, çoğullar zaten iyi bir sözcük listesinde olacaktı, ancak bunları herhangi bir nedenle listeden özel olarak çıkarmak istiyorsanız, gerçekten de onu işlemek için bir işlev yazabilirsiniz. Ancak İngilizce çoğullaştırma kuralları, başlamak için sözcük listesine çoğulları dahil etmem için yeterince karmaşık.

İngilizce kelime listelerinin nerede bulunacağına gelince, Google'da "İngilizce kelime listesi" ile birkaç tane buldum. İşte bir tane: http://www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt Özellikle bu lehçelerden birini istiyorsanız, İngiliz veya Amerikan İngilizcesi için Google'ı kullanabilirsiniz.


9
english_wordsA setyerine a yaparsanız list, is_english_wordçok daha hızlı çalışır.
dan04

Aslında bunu bir dikte olarak yeniden yazdım ama haklısın, bir set daha da iyi. Güncellenmiş.
kindall

1
Ayrıca hendek .xreadlines()atıp tekrar tekrar deneyebilirsiniz word_file.
FogleBird

3
Ubuntu altında paketleri wamericanve wbritishAmerikan ve İngiliz İngilizcesi kelime listelerini /usr/share/dict/*-english. Paket bilgisi wordlist.sourceforge.net'i referans olarak verir .
intuited

1
479k İngilizce kelime içeren bir GitHub deposu buluyorum .
haolee

6

Daha hızlı bir NLTK tabanlı çözüm için, doğrusal bir aramadan kaçınmak için kelime kümesine hash uygulayabilirsiniz.

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
Sözlük yerine set kullanın
jhuang

4

Sorunu çözmek için 3 paket tabanlı çözüm olduğunu görüyorum. Pyenchant, wordnet ve corpus'tur (kendi tanımlı veya ntlk'den). Pyenchant , py3 ile win64'e kolayca kurulamadı . Wordnet pek iyi çalışmıyor çünkü külliyat tamamlanmamış. Bu yüzden benim için @ Sadik tarafından cevaplanan çözümü seçiyorum ve hızlandırmak için 'set (words.words ())' kullanıyorum.

İlk:

pip3 install nltk
python3

import nltk
nltk.download('words')

Sonra:

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

print("hello" in setofwords)
>>True

3

PyEnchant.checker SpellChecker ile:

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
Metin 3 kelimeden uzunsa ve 4'ten az hata varsa (tanınmayan kelimeler) bu doğru olarak dönecektir. Genel olarak benim kullanım durumum için bu ayarlar oldukça iyi çalışıyor.
grizmin

1

Anlamsal bir web yaklaşımı için, WordNet'e karşı RDF biçiminde bir sparql sorgusu çalıştırabilirsiniz . Temel olarak, GET isteğini yayınlamak ve sonuçları JSON biçiminde döndürmek için urllib modülünü kullanın, python 'json' modülünü kullanarak ayrıştırın. İngilizce bir kelime değilse sonuç alamazsın.

Başka bir fikir olarak, Vikisözlük API'sini sorgulayabilirsiniz .


1

Tüm Linux / Unix Kullanıcıları İçin

İşletim sisteminiz Linux çekirdeğini kullanıyorsa, tüm kelimeleri İngilizce / Amerikan sözlüğünden almanın basit bir yolu vardır. Dizinde /usr/share/dictbir wordsdosyanız var. Daha spesifik american-englishve british-englishdosyalar da var. Bunlar, o belirli dildeki tüm kelimeleri içerir. Buna her programlama dilinde erişebilirsiniz, bu yüzden bunu bilmek isteyebileceğinizi düşündüm.

Şimdi, python'a özgü kullanıcılar için, aşağıdaki python kodu, her bir kelimenin değerini alması için liste kelimelerini atamalıdır:

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

Bu yardımcı olur umarım!!!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.