Исправить слова и удалить ненужные пробелы между разделенным словом, используя python? - PullRequest
0 голосов
/ 05 марта 2019

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

У меня есть предложения типа Java is a prog rammng lan guage. C is a gen eral purpose la nguage.

Я хотел бы исправить такие предложения, используя словарь поиска? удалить ненужные пробелы.

Окончательный результат должен быть Java is a programmng language. C is a general purpose language.

Мне нужна помощь с некоторыми указателями, чтобы искать такие подходы. Как решить вышеуказанную проблему?

Я хочу решить вышеупомянутую проблему, используя код Python. Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Вот простой скрипт, который работает для вашего примера. Очевидно, вы хотели бы больший корпус правильных слов. Кроме того, вы, возможно, захотите иметь ветку elif, которая оглянулась бы на предыдущее слово, если при присоединении следующего слова не удалось исправить не-слово.

from string import punctuation

word_list = "big list of words including a programming language is general purpose"
valid_words = set(word_list.split())

bad = "Java is a prog ramming lan guage. C is a gen eral purpose la nguage."
words = bad.split()

out_words = []
i = 0
while i < len(words):
    word = words[i]
    if word not in valid_words and i+1 < len(words):
        next_word = words[i+1]
        joined = word + next_word
        if joined.strip(punctuation) in valid_words:
            word = joined
            i += 1
    out_words.append(word)
    i += 1

good = " ".join(out_words)
print(good)
0 голосов
/ 05 марта 2019

Вам понадобится проверка орфографии, если вы хотите, чтобы слова были написаны и проанализированы правильно. Вот проверка орфографии, используемая при импорте пространства имен re, с полной статьей here ...

import re
from collections import Counter

def words(text): return re.findall(r'\w+', text.lower())

WORDS = Counter(words(open('big.txt').read()))

def P(word, N=sum(WORDS.values())): 
    "Probability of `word`."
    return WORDS[word] / N

def correction(word): 
    "Most probable spelling correction for `word`."
    return max(candidates(word), key=P)

def candidates(word): 
    "Generate possible spelling corrections for `word`."
    return (known([word]) or known(edits1(word)) or known(edits2(word)) or [word])

def known(words): 
    "The subset of `words` that appear in the dictionary of WORDS."
    return set(w for w in words if w in WORDS)

def edits1(word):
    "All edits that are one edit away from `word`."
    letters    = 'abcdefghijklmnopqrstuvwxyz'
    splits     = [(word[:i], word[i:])    for i in range(len(word) + 1)]
    deletes    = [L + R[1:]               for L, R in splits if R]
    transposes = [L + R[1] + R[0] + R[2:] for L, R in splits if len(R)>1]
    replaces   = [L + c + R[1:]           for L, R in splits if R for c in letters]
    inserts    = [L + c + R               for L, R in splits for c in letters]
    return set(deletes + transposes + replaces + inserts)

def edits2(word): 
    "All edits that are two edits away from `word`."
    return (e2 for e1 in edits1(word) for e2 in edits1(e1))`

Он не только исправляет разделенные слова, но также удаляет, транспонирует и вставляет неправильные слова, чтобы «исправить» их. Вы можете заменить файл «big.txt» документом, который вы используете в конструкторе Counter, и, надеюсь, все будет работать оттуда.

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