Làm thế nào để kiểm tra nếu một từ là một từ tiếng Anh với Python?


134

Tôi muốn kiểm tra chương trình Python nếu một từ có trong từ điển tiếng Anh.

Tôi tin rằng giao diện wordnet nltk có thể là cách để đi nhưng tôi không biết làm thế nào để sử dụng nó cho một nhiệm vụ đơn giản như vậy.

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

is_english_word(token.lower())

Trong tương lai, tôi có thể muốn kiểm tra xem dạng số ít của một từ có trong từ điển không (ví dụ: property -> property -> English word). Làm thế nào tôi đạt được điều đó?

Câu trả lời:


215

Để có nhiều sức mạnh và linh hoạt hơn, hãy sử dụng một thư viện kiểm tra chính tả chuyên dụng như thế nào PyEnchant. Có một hướng dẫn , hoặc bạn có thể đi thẳng vào:

>>> 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đi kèm với một vài từ điển (en_GB, en_US, de_DE, fr_FR), nhưng có thể sử dụng bất kỳ từ điển nào của OpenOffice nếu bạn muốn có nhiều ngôn ngữ hơn.

Dường như có một thư viện số nhiều được gọi inflect, nhưng tôi không biết liệu nó có tốt không.


2
Cảm ơn bạn, tôi không biết về PyEnchant và nó thực sự hữu ích hơn nhiều đối với loại séc tôi muốn thực hiện.
Barthelemy

Nó không nhận ra <helo>? Không phải là một từ phổ biến, nhưng tôi biết <helo> là một từ viết tắt của <máy bay trực thăng> và tôi không biết <Helot>. Chỉ muốn chỉ ra rằng giải pháp không phải là một kích cỡ phù hợp với tất cả và một dự án khác nhau có thể yêu cầu từ điển khác nhau hoặc một cách tiếp cận khác nhau hoàn toàn.
dmh

15
Gói về cơ bản là không thể cài đặt cho tôi. Siêu bực bội.
Monica Heddneck

9
Enchant không được hỗ trợ tại thời điểm này cho python 64 bit trên windows :( github.com/rfk/pyenchant/issues/42
Ricky Boyce

9
pyenchant không còn được duy trì. pyhunspell có nhiều hoạt động gần đây. Ngoài ra /usr/share/dict//var/lib/dictcó thể được tham chiếu trên các thiết lập * nix.
pkfm

48

Nó sẽ không hoạt động tốt với WordNet, vì WordNet không chứa tất cả các từ tiếng Anh. Một khả năng khác dựa trên NLTK mà không có bùa mê là từ ngữ của NLTK

>>> 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
Điều tương tự cũng được áp dụng ở đây: nhanh hơn rất nhiều khi được chuyển đổi thành một bộ:set(words.words())
Iulius Curt

xem ra khi bạn cần từ số ít để có kết quả phù hợp
famargar

2
Cẩn thận: những từ như mì ống hoặc burger không được tìm thấy trong danh sách này
Paroksh Saxena

45

Sử dụng NLTK :

from nltk.corpus import wordnet

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

Bạn nên tham khảo bài viết này nếu bạn gặp khó khăn khi cài đặt wordnet hoặc muốn thử các phương pháp khác.


2
Nó đặc biệt hữu ích cho người dùng cygwin vì việc cài đặt bùa mê khá khó khăn.
alehro

27
WordNet không chứa mọi từ trong tiếng Anh, nó chỉ chứa một tập hợp con nhỏ của nó.
cần

2
Trên đầu wordnet thiếu một tấn các từ phổ biến như 'would' và 'how', điều này chậm hơn đáng kể so với giải pháp của kindall.
Ryan Epp

3
hơn nữa, wordnet.synsets không đơn giản kiểm tra xem một từ có trong đó không. Nó cố gắng để lemmaize đầu tiên. Vì vậy, nó chuyển đổi "saless" (không phải là một từ tiếng Anh thực sự) thành "bán hàng".
Lyndon White

đó là một phương pháp hoàn hảo để làm điều này, xem xét cách thức hoạt động của các khớp thần kinh. đặt 'nghiêng' để xem những gì tôi đang nói
RetroCode

37

Sử dụng một bộ để lưu danh sách từ vì tìm kiếm chúng sẽ nhanh hơn:

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

Để trả lời phần thứ hai của câu hỏi, số nhiều sẽ có trong một danh sách từ tốt, nhưng nếu bạn muốn loại trừ cụ thể những thứ đó khỏi danh sách vì một số lý do, bạn thực sự có thể viết một hàm để xử lý nó. Nhưng các quy tắc số nhiều tiếng Anh đủ phức tạp để tôi chỉ đưa các số nhiều vào danh sách từ để bắt đầu.

Về nơi để tìm danh sách từ tiếng Anh, tôi đã tìm thấy một số chỉ bằng cách "danh sách từ tiếng Anh" của Google. Đây là một: http://www.sil.org/linguistic/wordlists/english/wordlist/wordsEn.txt Bạn có thể Google cho tiếng Anh hoặc tiếng Anh Mỹ nếu bạn muốn cụ thể một trong những phương ngữ đó.


9
Nếu bạn thực hiện english_wordsmột setthay vì một list, sau đó is_english_wordsẽ chạy nhanh hơn rất nhiều.
dan04

Tôi thực sự chỉ làm lại nó như một lệnh, nhưng bạn nói đúng, một bộ thậm chí còn tốt hơn. Cập nhật.
loại

1
Bạn cũng có thể bỏ qua .xreadlines()và chỉ lặp đi lặp lại word_file.
FogleBird

3
Trong ubfox các gói wamericanwbritishcung cấp danh sách từ tiếng Anh Mỹ và Anh như /usr/share/dict/*-english. Thông tin gói cung cấp cho wordlist.sourceforge.net làm tài liệu tham khảo.
trực giác

1
Tôi tìm thấy một kho GitHub chứa 479k từ tiếng Anh.
haolee

6

Để có giải pháp dựa trên NLTK nhanh hơn, bạn có thể băm tập hợp các từ để tránh tìm kiếm tuyến tính.

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
Thay vì từ điển, hãy sử dụng một bộ
jhuang

4

Tôi thấy rằng có 3 giải pháp dựa trên gói để giải quyết vấn đề. Chúng là pyenchant, wordnet và corpus (tự xác định hoặc từ ntlk). Pyenchant không thể cài đặt dễ dàng trong win64 với py3 . Wordnet không hoạt động tốt vì nó không hoàn thành. Vì vậy, đối với tôi, tôi chọn giải pháp được trả lời bởi @Sadik và sử dụng 'set (words.words ())' để tăng tốc.

Đầu tiên:

pip3 install nltk
python3

import nltk
nltk.download('words')

Sau đó:

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

print("hello" in setofwords)
>>True

3

Với SpellChecker 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
Điều này sẽ trả về true nếu văn bản dài hơn 3 từ và có ít hơn 4 lỗi (các từ không được công nhận). Nói chung đối với trường hợp sử dụng của tôi, các cài đặt đó hoạt động khá tốt.
Grizmin

1

Đối với cách tiếp cận web ngữ nghĩa, bạn có thể chạy truy vấn sparql đối với WordNet ở định dạng RDF . Về cơ bản chỉ cần sử dụng mô-đun urllib để đưa ra yêu cầu GET và trả về kết quả ở định dạng JSON, phân tích cú pháp bằng mô-đun python 'json'. Nếu đó không phải là từ tiếng Anh, bạn sẽ không nhận được kết quả.

Như một ý tưởng khác, bạn có thể truy vấn API của Wiktionary .


1

Dành cho tất cả người dùng Linux / Unix

Nếu hệ điều hành của bạn sử dụng nhân Linux, có một cách đơn giản để lấy tất cả các từ trong từ điển Anh / Mỹ. Trong thư mục /usr/share/dictbạn có một wordstập tin. Ngoài ra còn có một cụ thể hơn american-englishbritish-englishtập tin. Chúng chứa tất cả các từ trong ngôn ngữ cụ thể đó. Bạn có thể truy cập ngôn ngữ này trong mọi ngôn ngữ lập trình, đó là lý do tại sao tôi nghĩ bạn có thể muốn biết về điều này.

Bây giờ, đối với người dùng cụ thể python, mã python bên dưới nên gán các từ danh sách để có giá trị của mỗi từ đơn:

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

Hi vọng điêu nay co ich!!!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.