удалить из текста только незнакомые слова, но оставить знаки препинания и цифры

У меня есть текст на французском языке, содержащий слова, разделенные пробелом (например, répu blique*). Я хочу удалить эти отдельные слова из текста и добавить их в список, сохранив в тексте знаки препинания и цифры. Мой код работает для добавления слов, которые разделены, но он не работает для сохранения цифр в тексте.

import nltk
from nltk.tokenize import word_tokenize

import re

with open ('french_text.txt') as tx: 
#opening text containing the separated words
    #stores the text with the separated words
    text = word_tokenize(tx.read().lower()) 


with open ('Fr-dictionary.txt') as fr:  #opens the dictionary
    dic = word_tokenize(fr.read().lower()) #stores the first dictionary

pat=re.compile(r'[.?\-",:]+|\d+')

out_file=open("newtext.txt","w") #defining name of output file
valid_words=[ ] #empty list to append the words checked by the dictionary 
invalid_words=[ ] #empty list to append the errors found

for word in text:
    reg=pat.findall(word)
    if reg is True:
        valid_words.append(word)
    elif word in dic:
        valid_words.append(word)#appending to a list the words checked 
    else:
        invalid_words.append(word) #appending the invalid_words



a=' '.join(valid_words) #converting list into a string

print(a) #print converted list
print(invalid_words) #print errors found

out_file.write(a) #writing the output to a file

out_file.close()

Итак, с этим кодом мой список ошибок идет с цифрами.

['ments', 'prési', 'répu', 'blique', 'diri', 'geants', '»', 'grand-est', 'elysée', 'emmanuel', 'macron', 'sncf', 'pepy', 'montparnasse', '1er', '2017.', 'geoffroy', 'hasselt', 'afp', 's', 'empare', 'sncf', 'grand-est', '26', 'elysée', 'emmanuel', 'macron', 'sncf', 'saint-dié', 'epinal', '23', '2018', 'etat', 's', 'vosges', '2018']

Я думаю, проблема в регулярном выражении. Какие-либо предложения? Спасибо!!


person Natália Resende    schedule 13.03.2019    source источник
comment
Легче показать образец текста и то, что с ним делает ваше регулярное выражение. Это лучше, потому что никто не знает, что находится в вашем файле или как вы его используете.   -  person    schedule 13.03.2019
comment
Другими словами, «каков ваш вклад и каков желаемый результат?»   -  person FailSafe    schedule 14.03.2019


Ответы (2)


Проблема в вашем операторе if, в котором вы проверяете reg is True. Вы не должны использовать оператор is с True, чтобы проверить, был ли результат pat.findall(word) положительным (т. е. у вас было совпадающее слово).

Вместо этого вы можете сделать это:

for word in text:
    if pat.match(word):
        valid_words.append(word)
    elif word in dic:
        valid_words.append(word)#appending to a list the words checked 
    else:
        invalid_words.append(word) #appending the invalid_words
person Ehsan    schedule 13.03.2019

Осторожно, пользователь: на самом деле это сложная проблема, потому что все зависит от того, что мы определяем как слово:

  • l’Académie это одно слово, как насчет j’eus ?
  • gallo-romanes это одно слово или c'est-à-dire?
  • как насчет J.-C.?
  • и xiv(e) (с надстрочным индексом, как в 14 веке)?
  • а потом QDN или QQ1 или LOL?

Вот прямое решение, которое вкратце выглядит следующим образом:

  1. разбить текст на «слова» и «не слова» (пунктуация, пробелы)
  2. проверить "слова" по словарю
# Adjust this to your locale
WORD = re.compile(r'\w+')

text = "foo bar, baz"

while True:
    m = WORD.search(text)
    if not m:
        if text:
            print(f"punctuation: {text!r}")
        break
    start, end = m.span()
    punctuation = text[:start]
    word = text[start:end]
    text = text[end:]
    if punctuation:
        print(f"punctuation: {punctuation!r}")
    print(f"possible word: {word!r}")

possible word: 'foo'
punctuation: ' '
possible word: 'bar'
punctuation: ', '
possible word: 'baz'

У меня такое ощущение, что вы пытаетесь справиться с намеренно написанными с ошибками / разбитыми словами, например. если кто-то пытается обойти правила черного списка форума или анализ речи.

Тогда лучшим подходом будет:

  1. определить, что может быть «словом» или «не словом», используя словарь
  2. затем разбейте текст

Если исходный текст был создан для того, чтобы обойти компьютеры, но быть удобочитаемым для людей, лучшим выбором будет ML/AI, скорее всего, нейронная сеть, такая как RNN, используемая для идентификации объектов на изображениях.

person Dima Tisnek    schedule 14.03.2019
comment
Я уже нашел решение для всех случаев, которые вы указали. Спасибо!! - person Natália Resende; 14.03.2019