Bagaimana cara memeriksa apakah suatu kata adalah kata bahasa Inggris dengan Python?

134

Saya ingin memeriksa program Python jika ada kata dalam kamus bahasa Inggris.

Saya percaya antarmuka wordnet nltk mungkin cara untuk pergi tapi saya tidak tahu bagaimana menggunakannya untuk tugas yang sederhana.

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

is_english_word(token.lower())

Di masa depan, saya mungkin ingin memeriksa apakah bentuk kata tunggal dalam kamus (misalnya, properti -> properti -> kata bahasa Inggris). Bagaimana saya mencapai itu?

Barthelemy
sumber

Jawaban:

215

Untuk (lebih) lebih banyak kekuatan dan fleksibilitas, gunakan perpustakaan pemeriksa ejaan khusus seperti PyEnchant. Ada tutorial , atau Anda bisa langsung masuk:

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

PyEnchantdilengkapi dengan beberapa kamus (en_GB, en_US, de_DE, fr_FR), tetapi dapat menggunakan salah satu dari yang OpenOffice jika Anda ingin lebih banyak bahasa.

Tampaknya ada perpustakaan pluralisasi yang disebut inflect, tetapi saya tidak tahu apakah itu bagus.

Katriel
sumber
2
Terima kasih, saya tidak tahu tentang PyEnchant dan ini memang jauh lebih berguna untuk jenis cek yang ingin saya buat.
Barthelemy
Itu tidak mengenali <helo>? Bukan kata yang umum, tapi saya tahu <helo> sebagai singkatan untuk <helicopter>, dan saya tidak tahu <Helot>. Hanya ingin menunjukkan bahwa solusinya tidak satu ukuran untuk semua dan bahwa proyek yang berbeda mungkin memerlukan kamus yang berbeda atau pendekatan yang berbeda sama sekali.
dmh
15
Paket pada dasarnya tidak mungkin dipasang untuk saya. Sangat membuat frustrasi.
Monica Heddneck
9
Enchant saat ini tidak didukung untuk python 64bit di windows :( github.com/rfk/pyenchant/issues/42
Ricky Boyce
9
pyenchant tidak lagi dipertahankan. pyhunspell memiliki aktivitas yang lebih baru. Juga /usr/share/dict/dan /var/lib/dictdapat dirujuk pada pengaturan * nix.
pkfm
48

Ini tidak akan bekerja dengan baik dengan WordNet, karena WordNet tidak mengandung semua kata bahasa Inggris. Kemungkinan lain berdasarkan NLTK tanpa enchant adalah kata-kata NLTK corpus

>>> 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
Sadik
sumber
5
Penyebutan yang sama berlaku di sini juga: jauh lebih cepat ketika dikonversi ke set:set(words.words())
Iulius Curt
hati-hati karena Anda perlu membuat kata-kata tunggal untuk mendapatkan hasil yang tepat
famargar
2
hati-hati: kata-kata seperti pasta atau burger tidak ditemukan dalam daftar ini
Paroksh Saxena
45

Menggunakan NLTK :

from nltk.corpus import wordnet

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

Anda harus merujuk ke artikel ini jika Anda mengalami kesulitan menginstal wordnet atau ingin mencoba pendekatan lain.

Susheel Javadi
sumber
2
Ini sangat berguna bagi pengguna cygwin karena pemasangan enchant cukup bermasalah.
alehro
27
WordNet tidak mengandung setiap kata dalam bahasa Inggris, hanya berisi sebagian kecil saja.
justhalf
2
Di atas wordnet hilang satu ton kata-kata umum seperti 'akan' dan 'bagaimana' ini terasa lebih lambat daripada solusi kindall.
Ryan Epp
3
Selanjutnya, wordnet.synsets tidak hanya memeriksa apakah ada kata di dalamnya. Mencoba lemmaize pertama. Jadi itu mengubah "saless" (bukan kata bahasa Inggris yang nyata) menjadi "penjualan".
Lyndon White
itulah metode yang cacat untuk melakukan ini, mengingat cara kerja sinkronisasi. letakkan 'miring' untuk melihat apa yang saya katakan
RetroCode
37

Menggunakan set untuk menyimpan daftar kata karena mencari mereka akan lebih cepat:

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

Untuk menjawab bagian kedua dari pertanyaan, bentuk jamak sudah ada dalam daftar kata yang bagus, tetapi jika Anda ingin secara khusus mengecualikan mereka dari daftar karena beberapa alasan, Anda memang bisa menulis fungsi untuk mengatasinya. Tapi aturan pluralisasi bahasa Inggris cukup rumit sehingga saya hanya perlu memasukkan bentuk jamak dalam daftar kata.

Ke mana menemukan daftar kata bahasa Inggris, saya menemukan beberapa hanya dengan Googling "daftar kata bahasa Inggris". Ini salah satunya: http://www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt Anda dapat menggunakan Google untuk Bahasa Inggris atau Bahasa Inggris Amerika jika Anda menginginkan secara khusus salah satu dialek tersebut.

baik hati
sumber
9
Jika Anda membuat english_wordssebuah setbukannya list, maka is_english_wordakan berjalan jauh lebih cepat.
dan04
Saya sebenarnya hanya mengubahnya sebagai dict tetapi Anda benar, satu set bahkan lebih baik. Diperbarui.
kindall
1
Anda juga dapat meninggalkan .xreadlines()dan hanya beralih word_file.
FogleBird
3
Di bawah ubuntu paket-paket wamericandan wbritishmemberikan daftar kata-kata bahasa Inggris Amerika dan Inggris sebagai /usr/share/dict/*-english. Info paket memberikan wordlist.sourceforge.net sebagai referensi.
intuited
1
Saya menemukan repositori GitHub yang berisi 479 ribu kata bahasa Inggris.
haolee
6

Untuk solusi berbasis NLTK yang lebih cepat, Anda dapat memotong sekumpulan kata untuk menghindari pencarian linear.

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
Eb Abadi
sumber
2
Alih-alih menggunakan kamus, gunakan set
jhuang
4

Saya menemukan bahwa ada 3 solusi berbasis paket untuk menyelesaikan masalah. Mereka adalah pyenchant, wordnet dan corpus (self-defined atau dari ntlk). Pyenchant tidak dapat diinstal dengan mudah di win64 dengan py3 . Wordnet tidak berfungsi dengan baik karena itu corpus tidak lengkap. Jadi bagi saya, saya memilih solusi yang dijawab oleh @Sadik , dan gunakan 'set (words.words ())' untuk mempercepat.

Pertama:

pip3 install nltk
python3

import nltk
nltk.download('words')

Kemudian:

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

print("hello" in setofwords)
>>True
Yang muda
sumber
3

Dengan pyEnchant.checker Pemeriksa Ejaan:

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
grizmin
sumber
1
Ini akan mengembalikan true jika teks lebih panjang dari 3 kata dan ada kurang dari 4 kesalahan (kata-kata yang tidak dikenali). Secara umum untuk kasus penggunaan saya pengaturan tersebut berfungsi dengan cukup baik.
grizmin
1

Untuk pendekatan web semantik, Anda bisa menjalankan kueri sparql terhadap WordNet dalam format RDF . Pada dasarnya cukup gunakan modul urllib untuk mengeluarkan permintaan GET dan mengembalikan hasil dalam format JSON, parsing menggunakan modul python 'json'. Jika bukan kata bahasa Inggris, Anda tidak akan mendapatkan hasil.

Sebagai ide lain, Anda dapat meminta API Wiktionary .

burkestar
sumber
1

Untuk Semua Pengguna Linux / Unix

Jika OS Anda menggunakan kernel Linux, ada cara sederhana untuk mendapatkan semua kata dari kamus bahasa Inggris / Amerika. Di direktori /usr/share/dictAnda memiliki wordsfile. Ada juga yang lebih spesifik american-englishdan british-englishfile. Ini mengandung semua kata dalam bahasa spesifik itu. Anda dapat mengakses ini di setiap bahasa pemrograman yang mengapa saya pikir Anda mungkin ingin tahu tentang ini.

Sekarang, untuk pengguna khusus python, kode python di bawah ini harus menetapkan kata daftar untuk memiliki nilai setiap kata:

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

Semoga ini membantu!!!

Linux4Life531
sumber