Python - Существует ли NLTK Corpus для английских sh GB слов? - PullRequest
0 голосов
/ 22 апреля 2020

Я нахожусь в процессе изучения Python и пытаюсь создать создателя / решателя анаграмм в flask.

Я использую nltk и у меня настроен базовый c скрипт, который дескремблирует группа букв и находит слово из корпуса. Я знаю, что мой метод может быть не идеальным - помните, что я все еще изучаю, что можно сделать в Python - но он работает в принципе, и я создал аналогичный скрипт, чтобы найти все слова в группе букв.

Моя проблема в том, что он использует только американский английский sh, поэтому в приведенном ниже примере «favro» становится «одолжением», которое является американским правописанием, но «favrou» не становится «одолжением», которое является Briti sh spelling.

import itertools
import nltk
from nltk.corpus import words
english_vocab = set(w.lower() for w in nltk.corpus.words.words())
scramble = "favro"
sep = ""
for y in list(itertools.permutations(scramble, len(scramble))):
    if (sep.join(y) in english_vocab):
        print(sep.join(y))

Есть ли что-нибудь, что отличает американцев от Briti sh Engli sh?

Я пытался использовать 'enchant' и это хорошо работает на решающей части, но когда я пытаюсь создать список слов в слове, это невероятно медленно. Например, когда я пытаюсь найти все слова в «цветах», nltk занимает 0,08 секунды, а enchant - 2,5 секунды. Эта разница во времени увеличивается с увеличением количества букв, поэтому зачарование нежизнеспособно.

Есть идеи?

Стив

1 Ответ

0 голосов
/ 23 апреля 2020

Если вы используете NLTK только для набора слов, вам может потребоваться найти список слов из Британии sh -Engli sh слов и прочитать его вместо этого.

Так как мы ' Разговариваете с решателями анаграмм, почему бы не использовать список слов SOWPODS, используемый в официальных соревнованиях по скрэбблу?

Например, https://raw.githubusercontent.com/jesstess/Scrabble/master/scrabble/sowpods.txt (предупреждение: большой файл!) содержит FAVOUR, поэтому он должен работать для вас.

РЕДАКТИРОВАТЬ: Чтобы уточнить мой комментарий, например,

from collections import defaultdict

ws = defaultdict(set)

for word in open("./sowpods.txt"):
    word = word.lower().strip()
    if word:
        ws[frozenset(word)].add(word)


def find(word):
    return ws[frozenset(word)]


print(find("wired"))

выводит

{'rewired', 'weirdie', 'wiredrew', 'dewier', 'weired', 'widder', 'wried', 'weird', 'weirded', 'weedier', 'wider', 'wired', 'weirder'}

за 0,7 секунды ,

(Да, это расширенный набор возможных слов, но его легко отфильтровать. Еще один вариант, который мог бы избежать этого, - использовать ''.join(sorted(word)) в качестве ключа для выбора).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...