Jak mogę sprawdzić, czy przypadkowy ciąg brzmi po angielsku?

głosy
22

Mam algorytmu, który generuje ciągi na podstawie listy słów wejściowych. Jak mogę oddzielić tylko struny, które brzmi jak angielskich słów? to znaczy. odrzucić RDLO zachowując Pana .

EDIT: Do wyjaśnienia, nie muszą być rzeczywiste słowa w słowniku. Oni po prostu muszą brzmieć jak angielski. Na przykład KEAL będą akceptowane.

Utwórz 18/09/2008 o 13:20
źródło użytkownik
W innych językach...                            


13 odpowiedzi

głosy
28

można zbudować łańcuch Markowa ogromnego angielskiego tekstu.

Następnie można karmić słowa w łańcuchu Markowa i sprawdzić, jak wysokie jest prawdopodobieństwo, że słowo jest angielski.

Zobacz tutaj: http://en.wikipedia.org/wiki/Markov_chain

Na dole strony można zobaczyć generator tekstu Markowa. Co chcesz, jest dokładnie odwrotna od niego.

W skrócie: W łańcuchach Markowa przechowuje dla każdego znaku prawdopodobieństw który następny znak będzie. Można rozszerzyć ten pomysł do dwóch lub trzech znaków, jeśli masz wystarczająco dużo pamięci.

Odpowiedział 18/09/2008 o 13:23
źródło użytkownik

głosy
18

Prosty sposób filtry Bayesa (przykład Python od http://sebsauvage.net/python/snyppets/#bayesian )

from reverend.thomas import Bayes
guesser = Bayes()
guesser.train('french','La souris est rentrée dans son trou.')
guesser.train('english','my tailor is rich.')
guesser.train('french','Je ne sais pas si je viendrai demain.')
guesser.train('english','I do not plan to update my website soon.')

>>> print guesser.guess('Jumping out of cliffs it not a good idea.')
[('english', 0.99990000000000001), ('french', 9.9999999999988987e-005)]

>>> print guesser.guess('Demain il fera très probablement chaud.')
[('french', 0.99990000000000001), ('english', 9.9999999999988987e-005)]
Odpowiedział 18/09/2008 o 13:42
źródło użytkownik

głosy
4

Można podejść do tego przez tokenizing ciąg kandydata do bigrams -pairs z adjascent listów-i sprawdzanie każdego bigram przed stołem angielskich częstotliwości BIGRAM.

  • Prosta: jeśli BIGRAM jest wystarczająco niska na stole częstotliwości (lub wręcz nieobecny), odrzucić ciąg jako nieprawdopodobne. (String zawiera "QZ" bigram? Odrzuć!)
  • Mniej prosta: obliczyć całkowitą wiarygodność całego łańcucha w zakresie, powiedzmy, iloczyn częstotliwości każdego BIGRAM podzielony przez średnią częstotliwością ważny ciąg angielskiej tej długości. Pozwoliłoby to zarówno (a) przyjąć ciąg z nieparzystej BIGRAM niskiej częstotliwości spośród inaczej bigrams wysokiej częstotliwości, oraz (b) odrzucić ciąg z kilku pojedynczych bigrams nisko ale-nie-całkiem-pod-the-progowych ,

Każda z nich wymaga trochę dostrojenie progu (ów), drugi techniki bardziej niż pierwszy.

Robi to samo z trygramów będzie prawdopodobnie bardziej wytrzymałe, chociaż to będzie prawdopodobnie doprowadziłyby do nieco bardziej ścisłym zestawem „valid” strun. Czy to zwycięstwo czy nie, zależy od aplikacji.

Bigramów i trygram tabele oparte na istniejących korpusów badań mogą być dostępne za darmo lub zakupu (ja nie znaleźliśmy żadnych swobodnie dostępne, ale tylko tak pobieżne google do tej pory), ale można obliczyć BIGRAM lub trygram tabeli z siebie z jakiegokolwiek dobra- wielkości korpusu tekstów po angielsku. Tylko korby przez każdego słowa jako token i zgadzają się każdego bigram-ty może obsłużyć to jako hash z danym BIGRAM jako klucz i zwiększany licznik całkowitej jako wartość.

morfologia angielski i angielsko fonetyka są (znakomicie!) mniej niż izometryczny, więc technika ta może również generować ciągi że „wygląd” po angielsku, ale obecne kłopotliwych prounciations. Argument ten jest inny niż dla Trygramów bigrams-the weirdness wytwarzane przez analizę dźwięków, które wykorzystują wiele litery w sekwencji w celu wytworzenia danego fonem będzie zmniejszona, jeśli n-g obejmuje cały dźwięku. (Think "pług" lub "tsunami", na przykład).

Odpowiedział 18/09/2008 o 19:31
źródło użytkownik

głosy
4

Jest to dość łatwe do wygenerowania angielskiego brzmiące słowa za pomocą łańcucha Markowa. Przechodzenie do tyłu jest większym wyzwaniem, jednak. Jaki jest dopuszczalny margines błędu na wyniki? Zawsze możesz mieć listę wspólnych par liter, trójek, itp, a stopień ich na tej podstawie.

Odpowiedział 18/09/2008 o 13:22
źródło użytkownik

głosy
3

Należy badania „wymówienia” generatorów haseł, ponieważ próbujesz wykonać to samo zadanie.

Rozwiązanie Perl byłoby Crypt :: PassGen , które można trenować ze słownikiem (więc można trenować go do różnych języków, jeśli trzeba). Spacery w słowniku i zbiera statystyki na sekwencji 1, 2 i 3-literowych, a następnie buduje nowe „słowa” na podstawie względnej częstotliwości.

Odpowiedział 18/09/2008 o 13:44
źródło użytkownik

głosy
2

Metaphone i dwukrotnie Metaphone są podobne do SOUNDEX, z wyjątkiem mogą być nastawione bardziej w kierunku swojego celu, niż SOUNDEX . Są one przeznaczone do „hash” słowa na podstawie ich fonetyczne „dźwięk”, i są dobre w ten sposób do języka angielskiego (ale nie tak wiele innych języków i nazwy własne).

Jedną rzeczą, aby pamiętać o wszystkich trzech algorytmów jest to, że są one bardzo wrażliwe na pierwszej literze słowa twego. Na przykład, jeśli próbujesz dowiedzieć się, czy KEAL jest polsko-brzmiące, nie będzie znaleźć mecz REAL, ponieważ początkowe litery są różne.

Odpowiedział 18/09/2008 o 13:53
źródło użytkownik

głosy
2

Byłbym skłonny do uruchomienia algorytmu soundex nad słownika angielskich słów i buforują wyniki, a następnie SOUNDEX swój ciąg kandydata, a mecz z pamięci podręcznej.

W zależności od wymagań eksploatacyjnych, można wypracować algorytm dystans dla kodów SOUNDEX i akceptować ciągi wewnątrz pewnej tolerancji.

Soundex jest bardzo łatwe do wykonania - patrz Wikipedia dla opisu algorytmu.

Przykładem realizacja tego, co chcesz zrobić, to:

def soundex(name, len=4):
    digits = '01230120022455012623010202'
    sndx = ''
    fc = ''

    for c in name.upper():
        if c.isalpha():
            if not fc: fc = c
            d = digits[ord(c)-ord('A')]
            if not sndx or (d != sndx[-1]):
                sndx += d

    sndx = fc + sndx[1:]
    sndx = sndx.replace('0','')
    return (sndx + (len * '0'))[:len]

real_words = load_english_dictionary()
soundex_cache = [ soundex(word) for word in real_words ]

if soundex(candidate) in soundex_cache:
    print "keep"
else:
    print "discard"

Oczywiście trzeba zapewnić realizację read_english_dictionary.

EDIT : Twój przykładem „KEAL” będzie dobrze, ponieważ ma ten sam kod soundex (K400) jako „kil”. Może trzeba będzie zalogować odrzuconych słów i ręcznie zweryfikować je, jeśli chcesz dowiedzieć się awaryjność.

Odpowiedział 18/09/2008 o 13:30
źródło użytkownik

głosy
1

Nie muszą być prawdziwe angielskie słowa, czy tylko ciągi, które wyglądają jak mogliby być angielskich słów?

Jeśli po prostu trzeba wyglądać możliwych angielskich słów można zrobić analizę statystyczną na prawdziwych tekstów angielskich i wypracować które kombinacje liter występuje często. Kiedy już to zrobisz, że można wyrzucić strun, które są zbyt nieprawdopodobne, chociaż niektóre z nich mogą być prawdziwe słowa.

Albo może po prostu użyć słownika i odrzucanie słów, które nie znajdują się w nim (z niektórych uprawnień do liczby mnogiej i innych odmianach).

Odpowiedział 18/09/2008 o 13:25
źródło użytkownik

głosy
0

Sugerowałbym patrząc na test phi i indeks przypadek. http://www.threaded.com/cryptography2.htm

Odpowiedział 05/08/2010 o 18:29
źródło użytkownik

głosy
0

I pewnie ocenić każde słowo za pomocą algorytmu soundex na bazie angielskich słów. Jeśli robisz to na serwerze SQL powinien być dość łatwy w konfiguracji bazy danych zawierającej listę większości angielskich słów (za pomocą swobodnie dostępnego słownika), a serwer MSSQL został SOUNDEX zaimplementowany jako dostępnego Search-algorytmu.

Oczywiście można zaimplementować to, czy chcesz, w dowolnym języku - ale to może być nie lada zadaniem.

W ten sposób można dostać ocenę ile każde słowo brzmi jak angielskie słowo istniejącego, jeśli w ogóle, i można skonfigurować pewne limity, jak nisko chcesz chcą zaakceptować wyników. Można by pewnie warto rozważyć jak połączyć wyniki dla wielu słów, a to prawdopodobnie dostrojenia akceptacji limity oparte na badaniach.

Odpowiedział 18/09/2008 o 13:32
źródło użytkownik

głosy
0

To brzmi jak całkiem zaangażowanego zadania! Od szczytu głowy, spółgłoska fonem potrzebuje samogłoski przed lub po nim. Ustalenie, co jest fonem będzie dość trudne, choć! Prawdopodobnie będziesz musiał ręcznie wypisać ich listę. Na przykład, "TR" jest ok, ale nie "TD", etc.

Odpowiedział 18/09/2008 o 13:26
źródło użytkownik

głosy
0

Można je porównać do słownika (swobodnie dostępnych w Internecie), ale to może być kosztowne pod względem zużycia procesora. Poza tym, nie znam żadnego innego programowej sposób to zrobić.

Odpowiedział 18/09/2008 o 13:22
źródło użytkownik

głosy
-1

Chciałbym zaproponować kilka prostych zasad i standardowych parach i trojaczki byłoby dobre.

Przykładowo, angielskie brzmiące słowa podążają wzór samogłosek samogłoska spółgłoska-, oprócz niektórych dipthongs i standardowych par spółgłosek (np TH, IG i EI oo Tr). Z systemem takiego należy rozebrać się prawie wszystkie słowa, które nie brzmią jak mogą one być po angielsku. Można by znaleźć się na bliższym zbadaniu, że prawdopodobnie będzie strip wiele słów, które brzmią jak również po angielsku, ale można następnie rozpocząć dodawanie przepisów, które pozwalają na szerszy zakres słów i „pociąg” algorytmu ręcznie.

Nie usunie wszystkie fałszywe negatywy (np ja nie sądzę, by udało Ci się wymyślić reguły obejmuje „rythm” bez wyraźnego kodowania w tym rytmie to słowo), ale będzie to stanowić metodę filtrowania.

Ja też zakładając, że chcesz ciągów, które mogą być (angielskie słowa brzmią rozsądny gdy wymawiane) zamiast strun, które są zdecydowanie słowa z angielskim znaczeniem.

Odpowiedział 18/09/2008 o 13:35
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more