Podmiana znaku w słowie

Podmiana znaku w słowie
Paweł Tometczak
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 31
0

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

Kopiuj
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?

Althorion
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1620
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.

Paweł Tometczak
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 31
0

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

Althorion
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1620
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).

Arthan
  • Rejestracja: dni
  • Ostatnio: dni
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.

Kopiuj
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, '&€@'))
Paweł Tometczak
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 31
0

Mam tak i jest ok:

Kopiuj
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.

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
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

Althorion
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1620
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ś?

Paweł Tometczak
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 31
0

Ok, dziękuje za podpowiedzi.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.