Podmiana znaku w słowie

0

Mam liste słów, która zawiera wyrazy ze znakami niedozwolonymi np. &€@,

lista = [‚slowo’ , ‚do&’, ‚dwa’, ‚t@y’]

Jeżeli wyraz składa się ze znaków dozwolonych i nie, to zamieniamy znaki niedozwolone na spacje -- jeżeli podzieli to wyraz na co najmniej dwie części traktujemy je jako oddzielne wyrazy w późniejszym wyszukiwaniu n-gramów.
Po takich filtracjach do każdego wyrazu na początku dodajemy znak '<' i '>', które będą oznaczać początek i koniec wyrazu.

Jakieś pomysły?

4

Jakieś pomysły?

Tak. Narzucają się trzy rozwiązania:

  1. str.replace wykonane wielokrotnie: https://docs.python.org/3/library/stdtypes.html?highlight=replace#str.replace
  2. str.translate: https://docs.python.org/3/library/stdtypes.html#str.translate
  3. wyrażenia regularne: https://docs.python.org/3/library/re.html

Wybierz i przetestuj, które Ci najbardziej pasuje.

0

replace działa na str czyli trzeba iterować po każdym i w liście i sprawdzać czy słowo zawiera niedozwolony znak?

1

Tak, str.replace jest metodą str, jak zalinkowana wyżej dokumentacja pokazuje. Ogólnie chcesz z wykorzystaniem którejś z ww. metod zbudować sobie swoją funkcję, która robi od początku do końca to, co chcesz na pojedynczym stringu — czyli i podmienia znaki na spacje, i ozdabia tagami poszczególne wyrazy — i zmapować ją do tablicy map(funkcja, tablica).

1

nie bawiłem się jeszcze z translate, więc musiałem spróbować, mi wyszło coś takiego jak poniżej, nie jestem pewien czy taki właśnie chcesz uzyskać efekt.

def my_format(my_list, chars):
    tekst = ' '.join(my_list)
    trans = tekst.maketrans(chars, ' '*len(chars))
    tab = tekst.translate(trans).split()
    return list(map(lambda l: f'<{l}>', tab))

lista = ['slowo' , 'do&', 'dwa', 't@y']
print(my_format(lista, '&€@'))
0

Mam tak i jest ok:

strings = ["a", "ab", "&aa", "c","gg&hg"]

new_strings = []

for string in strings:
    new_string = string.replace('&', '--')
    new_strings.append(new_string)


print(new_strings)

ale jak do tego dodać żeby sprawdzał wiele znaków niedozwolonych?

A najlepiej aby:
pozwalał tylko na znaki z zadanego alfabetu (zgromadzić dozwolone alfabety jako plik JSON) zawierający słownik z nazwami alfabetów, a każdy alfabet to lista dopuszczonych znaków.

1

Poczytaj sobie coś w internecie, hasła:
tokenization,
text preprocessing.
Zobacz też, jak to jest zrobione tutaj: https://docs.fast.ai/text.core.html#Preprocessing-rules, albo:
https://www.nltk.org/api/nltk.tokenize.html

2

A najlepiej aby:
pozwalał tylko na znaki z zadanego alfabetu (zgromadzić dozwolone alfabety jako plik JSON) zawierający słownik z nazwami alfabetów, a każdy alfabet to lista dopuszczonych znaków.

Przeczytałeś moje linki? W szczególności, dokumentację str.translate? Jeśli tak, to czego nie zrozumiałeś?

0

Ok, dziękuje za podpowiedzi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1