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?

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.


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

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.


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.


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

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

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

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 .


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!!!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.