วิธีตรวจสอบว่าคำนั้นเป็นคำภาษาอังกฤษด้วย Python หรือไม่?


136

ฉันต้องการตรวจสอบในโปรแกรม Python หากมีคำอยู่ในพจนานุกรมภาษาอังกฤษ

ฉันเชื่อว่าอินเทอร์เฟซ nltk wordnet อาจเป็นวิธีที่จะไป แต่ฉันไม่รู้ว่าจะใช้มันอย่างไรสำหรับงานง่ายๆเช่นนี้

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

is_english_word(token.lower())

ในอนาคตฉันอาจต้องการตรวจสอบว่ารูปเอกพจน์ของคำอยู่ในพจนานุกรมหรือไม่ (เช่นคุณสมบัติ -> คุณสมบัติ -> คำภาษาอังกฤษ) ฉันจะบรรลุเป้าหมายนั้นได้อย่างไร?

คำตอบ:


216

สำหรับการใช้พลังงาน (มาก) 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>? ไม่ใช่คำทั่วไป แต่ฉันรู้จัก <helo> เป็นคำย่อของ <helicopter> และฉันไม่รู้จัก <Helot> แค่อยากจะชี้ให้เห็นว่าการแก้ปัญหาไม่ได้มีขนาดเดียวและโครงการอื่นอาจต้องใช้พจนานุกรมที่แตกต่างกันหรือแนวทางที่แตกต่างกันโดยสิ้นเชิง
dmh

18
โดยพื้นฐานแล้วแพคเกจเป็นไปไม่ได้ที่จะติดตั้งให้ฉัน น่าผิดหวังสุด ๆ
Monica Heddneck

9
ขณะนี้ยังไม่รองรับ Enchant สำหรับ python 64bit บน windows :( github.com/rfk/pyenchant/issues/42
Ricky Boyce

9
pyenchantไม่ได้รับการดูแลอีกต่อไป pyhunspellมีกิจกรรมล่าสุดเพิ่มเติม นอกจากนี้/usr/share/dict/และ/var/lib/dictอาจอ้างอิงในการตั้งค่า * nix
pkfm

52

มันใช้งานได้ไม่ดีกับ 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 Curt

ระวังที่คุณต้องแยกคำเพื่อให้ได้ผลลัพธ์ที่เหมาะสม
famargar

3
ข้อควรระวัง: ไม่พบคำเช่นพาสต้าหรือเบอร์เกอร์ในรายการนี้
Paroksh Saxena

46

ใช้ NLTK :

from nltk.corpus import wordnet

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

คุณควรอ้างถึงบทความนี้หากคุณมีปัญหาในการติดตั้ง wordnet หรือต้องการลองวิธีอื่น ๆ


2
เป็นประโยชน์อย่างยิ่งสำหรับผู้ใช้ cygwin เนื่องจากการติดตั้ง enchant นั้นค่อนข้างมีปัญหา
alehro

27
WordNet ไม่มีทุกคำในภาษาอังกฤษ แต่มีเพียงส่วนย่อยเล็กน้อยเท่านั้น
justhalf

2
ด้านบนของ wordnet ไม่มีคำทั่วไปมากมายเช่น 'would' และ 'how' ซึ่งช้ากว่าวิธีแก้ปัญหาของ kindall อย่างเห็นได้ชัด
Ryan Epp

3
นอกจากนี้ wordnet.synsets ไม่เพียงแค่ตรวจสอบว่ามีคำอยู่ในนั้นหรือไม่ มันพยายามที่จะอธิบายก่อน ดังนั้นจึงแปลง "saless" (ไม่ใช่คำในภาษาอังกฤษจริง) เป็น "sales"
Lyndon White

นั่นเป็นวิธีที่มีข้อบกพร่องในการทำเช่นนี้โดยพิจารณาถึงวิธีการทำงานของ synsets ใส่ 'tiltes' เพื่อดูว่าฉันกำลังพูดอะไร
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

อันที่จริงฉันแค่เปลี่ยนมันเป็นคำสั่ง แต่คุณพูดถูกเซ็ตจะดีกว่า อัปเดตแล้ว
kindall

1
คุณยังสามารถทิ้ง.xreadlines()และทำซ้ำได้อีกword_fileด้วย
FogleBird

3
ภายใต้อูบุนตูแพคเกจwamericanและwbritishให้รายการคำภาษาอเมริกันและอังกฤษเป็น/usr/share/dict/*-english. ข้อมูลแพ็คเกจให้wordlist.sourceforge.netเป็นข้อมูลอ้างอิง
ปรีชา

1
ฉันพบที่เก็บ GitHubซึ่งมีคำภาษาอังกฤษ 479k คำ
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) Pyenchant ไม่สามารถติดตั้งได้อย่างง่ายดายใน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 คำ (คำที่ไม่รู้จัก) โดยทั่วไปสำหรับกรณีการใช้งานของฉันการตั้งค่าเหล่านั้นทำงานได้ดี
grizmin

1

สำหรับวิธีการเว็บเชิงความหมายที่คุณสามารถเรียกใช้แบบสอบถาม SPARQL กับเครือข่ายคำในรูปแบบ โดยทั่วไปเพียงใช้โมดูล urllib เพื่อส่งคำขอ GET และส่งคืนผลลัพธ์ในรูปแบบ JSON แยกวิเคราะห์โดยใช้โมดูล python 'json' หากไม่ใช่คำภาษาอังกฤษคุณจะไม่ได้ผลลัพธ์

ในฐานะที่เป็นความคิดที่อื่นคุณสามารถสอบถามพจนานุกรมของ API


1

สำหรับผู้ใช้ Linux / Unix ทั้งหมด

หากระบบปฏิบัติการของคุณใช้เคอร์เนลของลินุกซ์มีวิธีง่ายๆในการรับคำศัพท์ทั้งหมดจากพจนานุกรมภาษาอังกฤษ / อเมริกัน ในไดเร็กทอรี/usr/share/dictคุณมีwordsไฟล์ นอกจากนี้ยังมีเฉพาะเจาะจงมากขึ้นamerican-englishและbritish-englishไฟล์ คำเหล่านี้ประกอบด้วยคำทั้งหมดในภาษาเฉพาะนั้น คุณสามารถเข้าถึงสิ่งนี้ได้ตลอดทุกภาษาการเขียนโปรแกรมซึ่งเป็นสาเหตุที่ฉันคิดว่าคุณอาจต้องการทราบเกี่ยวกับเรื่องนี้

ตอนนี้สำหรับผู้ใช้เฉพาะ python รหัส python ด้านล่างควรกำหนดคำในรายการให้มีค่าของทุกคำ:

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.