파이썬으로 단어가 영어 단어인지 확인하는 방법?


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에 대해 몰랐으며 실제로 확인하려는 종류의 검사에 훨씬 유용합니다.
Barthelemy

<helo>를 인식하지 못합니까? 일반적인 단어는 아니지만 <helicopter>의 약어로 <helo>를 알고 있으며 <Helot>을 모르겠습니다. 솔루션이 모든 규모에 적합하지 않으며 다른 프로젝트에 다른 사전이나 다른 접근 방식이 필요할 수 있음을 지적하고 싶었습니다.
dmh

15
패키지는 기본적으로 나를 위해 설치할 수 없습니다. 매우 실망스러운.
Monica Heddneck

9
인챈트는 창에 파이썬 64 비트 :(이 지원되지 않습니다 github.com/rfk/pyenchant/issues/42
리키 보이스

9
pyenchant 는 더 이상 유지되지 않습니다. pyhunspell 이 더 최근 활동을했습니다. 또한 /usr/share/dict//var/lib/dict* nix에서 스크립트 설정에서 참조 할 수있다.
pkfm

48

WordNet에 모든 영어 단어가 포함되어 있지 않기 때문에 WordNet에서는 제대로 작동하지 않습니다. 마법이없는 NLTK를 기반으로 한 또 다른 가능성은 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
같은 언급은 여기에서도 적용 훨씬 빨리 세트로 변환 할 때 :set(words.words())
Iulius 커트

적절한 결과를 얻으려면 단어를 단
수화

2
주의 : 파스타 나 햄버거 같은 단어는이 목록에서 찾을 수 없습니다
Paroksh Saxena

45

NLTK 사용 :

from nltk.corpus import wordnet

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

wordnet 설치에 문제가 있거나 다른 방법을 시도 하려면 이 기사를 참조하십시오 .


2
Enchant 설치는 상당히 문제가 있기 때문에 cygwin 사용자에게 특히 유용합니다.
alehro

27
WordNet에는 영어로 된 모든 단어가 포함되어 있지 않으며 일부 단어 만 포함되어 있습니다.
justhalf

2
wordnet 외에도 'would'와 'how'와 같은 일반적인 단어가 누락되어 kindall의 솔루션보다 눈에 띄게 느립니다.
Ryan Epp

3
또한 wordnet.synsets는 단어가 단어에 있는지 단순히 확인하지 않습니다. 먼저 정리를 시도합니다. 따라서 "saless"(실제 영어 단어 아님)를 "sales"로 변환합니다.
Lyndon White

이것이 synsets의 작동 방식을 고려할 때 잘못된 방법입니다. 내가 말하는 것을보기 위해 '틸트'를 넣으십시오
RetroCode

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

질문의 두 번째 부분에 대답하기 위해 복수형은 이미 좋은 단어 목록에 있지만 어떤 이유로 목록에서 특정 단어를 구체적으로 제외하려면 실제로 처리 할 수있는 함수를 작성할 수 있습니다. 그러나 영어 복수형 규칙은 까다로워서 단어 목록에 복수형을 포함시킬 것입니다.

영어 단어 목록을 찾을 수있는 곳은 Googling "영어 단어 목록"으로 여러 단어를 찾았습니다. 다음은 하나입니다. http://www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt 이러한 방언 중 하나를 원하는 경우 영국식 또는 미국식 영어를 Google에 사용할 수 있습니다.


9
당신이 만드는 경우 대신의 다음 훨씬 더 빨리 실행됩니다. english_wordssetlistis_english_word
dan04

나는 실제로 그것을 단지 dict로 redid했지만 당신 말이 맞습니다. 세트가 훨씬 좋습니다. 업데이트되었습니다.
kindall

1
당신은 또한 도랑 .xreadlines()하고 반복 할 수 있습니다 word_file.
FogleBird

3
우분투에서 패키지는 다음 wamerican과 같이 wbritish미국과 영국 영어 단어 목록을 제공 /usr/share/dict/*-english합니다. 패키지 정보는 wordlist.sourceforge.net 을 참조로 제공합니다 .
intuited

1
479k 영어 단어가 포함 된 GitHub 저장소 를 찾습니다 .
haolee

6

더 빠른 NLTK 기반 솔루션의 경우 선형 검색을 피하기 위해 단어 세트를 해시 할 수 있습니다.

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
사전 대신 세트를 사용하십시오
jhuang

4

문제를 해결하기위한 3 가지 패키지 기반 솔루션이 있습니다. 그들은 pyenchant, wordnet 및 corpus (자체 정의 또는 ntlk)입니다. Pychant는 win64에서 py3으로 쉽게 설치할 수 없습니다 . 말뭉치가 완전하지 않기 때문에 Wordnet은 잘 작동하지 않습니다. 그래서 나를 위해 @Sadik 의해 답변 된 솔루션을 선택하고 'set (words.words ())'를 사용하여 속도를 높입니다.

먼저:

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 SpellChecker로 :

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 개 미만인 경우 (인식되지 않은 단어) true를 반환합니다. 내 유스 케이스의 경우 일반적으로 이러한 설정이 잘 작동합니다.
grizmin

1

시맨틱 웹 접근 방식의 경우 WordNet에 대해 RDF 형식으로 sparql 쿼리를 실행할 수 있습니다 . 기본적으로 urllib 모듈을 사용하여 GET 요청을 발행하고 결과를 JSON 형식으로 반환하고 파이썬 'json'모듈을 사용하여 구문 분석하십시오. 영어 단어가 아닌 경우 결과가 없습니다.

또 다른 아이디어로 Wiktionary의 API를 쿼리 할 수 ​​있습니다 .


1

모든 Linux / Unix 사용자

OS에서 Linux 커널을 사용하는 경우 영어 / 미국 사전에서 모든 단어를 가져 오는 간단한 방법이 있습니다. 디렉토리 /usr/share/dictwords파일이 있습니다. 더 구체적 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

도움이 되었기를 바랍니다!!!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.