Jak prawidłowo poprzedzić słowo „a” i „an”?

93

Mam aplikację .NET, w której podając rzeczownik chcę, aby poprawnie poprzedzał to słowo „a” lub „an”. Jak bym to zrobił?

Zanim pomyślisz, że odpowiedzią jest po prostu sprawdzenie, czy pierwsza litera jest samogłoską, rozważ wyrażenia takie jak:

  • szczery błąd
  • używany samochód
ryeguy
źródło
4
Musisz również wziąć pod uwagę skróty, które mogą również prowadzić do pewnych nieporozumień w przypadku „a” lub „an” jak „NHL”, w przypadku których dźwięk litery zaczyna się od samogłoski, ale nie, jeśli skrót można wymawiać jako takie słowo jako „urządzenie NAS” lub „wydarzenie NASCAR”
JB King
5
Należy również pamiętać, że użycie a lub an może zależeć od konkretnej wymowy w różnorodności języka angielskiego. Jednym z takich przykładów jest brytyjska i amerykańska wymowa słowa herb.
Eric
12
@Eric: Rzeczywiście, moim ulubionym przykładem tego (również nerdy) jest „SQL”. Niektórzy ludzie wypowiadają litery „SQL”, inni wymawiają to jak słowo „sequel”. Każdy otrzymuje inne „a” lub „an”. np. to „instrukcja sequel” wersety „to instrukcja SQL”
Binary Worrier
Jeszcze trudniejsze jest to, że opinie różnią się nawet w ramach tego samego dialektu angielskiego! Na przykład oficjalny (brytyjski) angielski mówi nam, że „hotel” to poprawna struktura, ale większość ludzi używa słowa „hotel” w codziennych rozmowach. Jeśli napiszesz jeden, będzie to bardzo przydatne dla reszty z nas!
h4xxr
Ach ... „aspirant H”. Doskonale pamiętam moje pierwsze spotkanie z nim. Książka drugiej klasy nauk społecznych zatytułowana „An Historical Society”, książka o kolonialnym Williamsburgu.
Bob Kaufman

Odpowiedzi:

136
  1. Pobierz Wikipedię
  2. Rozpakuj go i napisz program szybkiego filtru, który wypluwa tylko tekst artykułu (pobieranie jest zwykle w formacie XML, wraz z metadanymi innymi niż artykuł).
  3. Znajdź wszystkie wystąpienia a (n) .... i utwórz indeks dla następującego słowa i wszystkich jego przedrostków (możesz użyć do tego prostego przyrostka). Powinna być rozróżniana wielkość liter, a maksymalna długość słowa - 15 liter?
  4. (opcjonalnie) Odrzuć wszystkie przedrostki, które występują mniej niż 5 razy lub w przypadku których „a” w porównaniu z „an” osiąga mniej niż 2/3 większości (lub inne progi - popraw tutaj). Najlepiej zachować pusty przedrostek, aby uniknąć przypadków narożnych.
  5. Możesz zoptymalizować swoją bazę danych prefiksów, odrzucając wszystkie te przedrostki, których rodzic ma tę samą adnotację „a” lub „an”.
  6. Przy określaniu, czy użyć „A” czy „AN”, znajdź najdłuższy pasujący prefiks i podążaj za nim. Jeśli nie odrzuciłeś pustego prefiksu w kroku 4, zawsze będzie pasujący prefiks (czyli pusty prefiks), w przeciwnym razie możesz potrzebować specjalnego przypadku dla całkowicie niepasującego ciągu (takie dane wejściowe powinny być bardzo rzadkie) .

Prawdopodobnie nie możesz być lepszy niż to - iz pewnością pokonuje większość systemów opartych na regułach.

Edit: Mam realizowane w ten JS / C # . Możesz wypróbować to w swojej przeglądarce lub pobrać niewielką implementację javascript wielokrotnego użytku, z której korzysta. Implementacja .NET jest pakietem AvsAnw nuget . Implementacje są trywialne, więc w razie potrzeby przeniesienie do dowolnego innego języka powinno być łatwe.

Okazuje się, że „zasady” są nieco bardziej złożone, niż myślałem:

  • to Nieoczekiwany wynik ale to Jednomyślność
  • to rzetelny decyzja ale krzew kapryfolium
  • Symbole: To numer 0800, lub ∞ oregano.
  • Akronimy: To naukowiec NASA, ale analityk NSA; samochodu FIAT ale polityka FAA.

... co tylko podkreśla, że ​​system oparty na regułach byłby trudny do zbudowania!

Eamon Nerbonne
źródło
A jeśli w tym wyniku brakuje rzeczownika, z pewnością można wrócić do prostego silnika reguł.
John Fisher
26
Biorąc pod uwagę, że pobieranie z Wikipedii dekompresuje się do (obecnie) 2,8 terabajtów, byłoby wspaniale, gdyby ktoś, kto korzysta z tej metody, opublikowałby publiczne dane, aby proces nie musiał być często powtarzany.
Nathan Long
10
Ta odpowiedź nie była do końca poważna, ale zrobiłem coś takiego, a plik .xml Wikipedii z surowym wikimarkupem ma tylko 40 GB (najnowszy jest zawsze trochę większy), a nie 2,8 TB - wszystko w jednym pliku - nie pobieraj rozszerzonej wersji .html ani żadnych obrazów, może to jest wersja o pojemności 2,8 TB? W każdym razie analizowanie jest całkiem wykonalne, o ile nie jesteś wybredny w kwestii znaczników.
Eamon Nerbonne
1
Jest to jeden z największych łatwo dostępnych i aktualnych zestawów danych języka naturalnego, jakie mogłem wymyślić. Jednak każde dodatkowe źródło danych też jest w porządku - w końcu algorytm nie zależy od Wikipedii. Możesz wypróbować implementację online na home.nerbonne.org/A-vs-An lub na moim blogu
Eamon Nerbonne
1
To rozwiązanie zrobiło na mnie ogromne wrażenie. Szczerze myślałem, że będzie to znacznie prostsze niż pobranie całej Wikipedii. Dobra robota, sir. +1
Kehlan Krumme
15

Musisz użyć listy wyjątków. Nie sądzę, aby wszystkie wyjątki były dobrze zdefiniowane, ponieważ czasami zależy to od akcentu osoby wypowiadającej dane słowo.

Jednym głupim sposobem jest poproszenie Google o dwie możliwości (za pomocą jednego z API wyszukiwania) i skorzystanie z najpopularniejszego:

Lub:

Dlatego „europa” i „uczciwy” to poprawne wersje.

rjmunro
źródło
6
Czy to rzeczywiście dozwolone użycie, czy też jest to prośba o zakazanie? Regularne takie stosowanie z pewnością nie jest mile widziane przez IIRC.
Eamon Nerbonne,
1
@Eamon: Ciekawa uwaga. Co by się stało, gdyby aplikacja zapisywała wszystkie słowa, które wcześniej wyszukała w Google, więc musi tylko raz wyszukać w Google każde nowe słowo, które napotka? Czy nadal byłoby to wątpliwe wykorzystanie Google?
gnovice
2
Poza oczywistymi trudnościami technicznymi (wykorzystanie wyników wyszukiwarki w sposób zautomatyzowany jest niedozwolone i będzie dość szybko blokowane), nie rozwiązuje to problemu w prawidłowy sposób - w najgorszym przypadku powiela powszechne nadużycie składnia.
Guss
6
W najgorszym? Istnieje dość mocny argument, że powielanie „powszechnego nadużycia” jest dokładnie tym, do czego powinien dążyć system języka naturalnego. Zobacz esej Davida Fostera Wallace'a „Authority and American Usage”, w publikacji Consider the Lobster . Istnieją lepsze korpusy niż Google, ale to inny problem.
Robert Rossney
2
„hotel” i „bohaterka” wydają mi się słuszne. Wydaje mi się, że przychodzisz z lekko kokieteryjnej perspektywy. Różne akcenty oznaczają, że nie ma właściwej odpowiedzi na niektóre z tych słów.
rjmunro
15

Gdybyś mógł znaleźć źródło pisowni słów do wymowy słów, takie jak:

"honest":"on-ist"
"horrible":"hawr-uh-buhl, hor-"

Możesz oprzeć swoją decyzję na pierwszym znaku ortograficznego ciągu wymowy. Aby zwiększyć wydajność, być może można użyć takiego wyszukiwania, aby wstępnie wygenerować zestawy wyjątków i zamiast tego użyć tych mniejszych zestawów wyszukiwania podczas wykonywania.

Edytowano, aby dodać:

!!! - Myślę, że możesz użyć tego do wygenerowania wyjątków: http://www.speech.cs.cmu.edu/cgi-bin/cmudict

Oczywiście nie wszystko będzie w słowniku - co oznacza, że ​​nie każdy możliwy wyjątek trafiłby do twoich zestawów wyjątków - ale w takim przypadku możesz po prostu domyślnie ustawić samogłoski / a dla spółgłosek lub użyć innej heurystyki z lepszymi szansami.

(Przeglądając słownik CMU, z przyjemnością zauważyłem, że zawiera on nazwy własne krajów i innych miejsc - więc podam przykłady takie jak „Ukrainiec”, „gazeta USA Today”, „obraz inspirowany Uralem”.)

Edycja jeszcze raz, aby dodać: Słownik CMU nie zawiera popularnych akronimów i musisz się martwić o te, które zaczynają się od s, f, l, m, n, u i x. Ale istnieje wiele list akronimów, takich jak Wikipedia, których możesz użyć, aby dodać do wyjątków.

Zaraz
źródło
2
Nie mogę się powstrzymać, ale hawr-uh-buhlzawsze mnie rozśmiesza.
IllidanS4 obsługuje Monikę
9

Musisz zaimplementować ręcznie i dodać wyjątki, które chcesz, na przykład, jeśli pierwsza litera to `` H '', a po niej `` O '', jak uczciwe, godzina ... a także przeciwne, takie jak europa, uniwersytet, używane ...

Ahmad Farid
źródło
1
tak, prawdziwy mężczyzna. Myślę, że się pomyliłem. To nie ma żadnej reguły
Ahmad Farid
8

Ponieważ „a” i „an” są określane przez reguły fonetyczne, a nie konwencje pisowni, prawdopodobnie zrobiłbym to w ten sposób:

  1. Jeśli pierwsza litera wyrazu jest spółgłoską -> „a”
  2. Jeśli pierwszą literą słowa jest samogłoska -> „an”
  3. Prowadź listę wyjątków (serce, prześwietlenie, dom), jak mówi rjumnro .
Patrik Svensson
źródło
5

Musisz przyjrzeć się regułom gramatycznym dla artykułów nieokreślonych (w gramatyce angielskiej są tylko dwa artykuły nieokreślone - „a” i „an”). Możesz się nie zgodzić, że brzmią poprawnie, ale zasady gramatyki angielskiej są bardzo jasne :

„Wyrazy a i an są przedimkami nieokreślonymi. Używamy przedimka nieokreślonego an przed wyrazami zaczynającymi się od dźwięku samogłoski (a, e, i, o, u) oraz przedimka nieokreślonego a przed wyrazami zaczynającymi się od spółgłoski (wszystkie inne litery). ”

Zauważ, że oznacza to dźwięk samogłoski , a nie literę samogłoski . Na przykład słowa zaczynające się na ciche „h”, takie jak „honor” lub „spadkobierca”, są traktowane jak samogłoski, a więc są poprzedzone „an” - na przykład „To zaszczyt cię poznać”. Słowa zaczynające się od spółgłoski są poprzedzone przedrostkiem - dlatego też mówisz „używany samochód” zamiast „używany samochód” - ponieważ „używany” ma raczej dźwięk „yoose” niż „uhh”.

Tak więc, jako programista, są to zasady, których należy przestrzegać. Musisz tylko znaleźć sposób określenia, od jakiego dźwięku zaczyna się słowo, a nie od jakiej litery. Widziałem przykłady tego, takie jak ten w PHP autorstwa Jaimiego Sirovicha:

function aOrAn($next_word) 
{ 
    $_an = array('hour', 'honest', 'heir', 'heirloom'); 
    $_a = array('use', 'useless', 'user'); 
    $_vowels = array('a','e','i','o','u'); 

    $_endings = array('ly', 'ness', 'less', 'lessly', 'ing', 'ally', 'ially'); 
    $_endings_regex = implode('|', $_endings); 

    $tmp = preg_match('#(.*?)(-| |$)#', $next_word, $captures); 
    $the_word = trim($captures[1]); 
    //$the_word = Format::trimString(Utils::pregGet('#(.*?)(-| |$)#', $next_word, 1)); 

    $_an_regex = implode('|', $_an); 
    if (preg_match("#($_an_regex)($_endings_regex)#i", $the_word)) { 
        return 'an'; 
    } 

    $_a_regex = implode('|', $_a); 
    if (preg_match("#($_a_regex)($_endings_regex)#i", $the_word)) { 
        return 'a'; 
    } 

    if (in_array(strtolower($the_word{0}), $_vowels)) { 
        return 'an';     
    } 

    return 'a'; 
}

Prawdopodobnie najłatwiej jest utworzyć regułę, a następnie utworzyć listę wyjątków i użyć jej. Nie wyobrażam sobie, że będzie ich aż tak wielu.

Dan Diplo
źródło
4

Człowieku, zdaję sobie sprawę, że jest to prawdopodobnie ustalony argument, ale myślę, że można go rozstrzygnąć łatwiej niż za pomocą reguł gramatycznych ad hoc z Wikipedii, które w najlepszym przypadku wyprowadziłyby gramatykę wernakularną.

Wydaje się, że najlepszym rozwiązaniem jest użycie a lub wyzwalacza do dopasowania fonemowego następnego wyrazu, przy czym pewne fonemy są zawsze kojarzone z „an”, a pozostałe należą do „a”.

Carnegie Mellon University ma świetne narzędzie internetowe do tego rodzaju kontroli - http://www.speech.cs.cmu.edu/cgi-bin/cmudict - i zawiera 125 tys. Słów z 39 pasującymi fonemami. Podłączenie słowa zapewnia cały zestaw fonemów, z których ważny jest tylko pierwszy.

Jeśli słowo nie pojawia się w słowniku, na przykład „NSA” i jest pisane wielką literą, system może przyjąć, że słowo jest akronimem i użyć pierwszej litery, aby określić, który artykuł nieokreślony należy użyć, na podstawie tego samego oryginalnego zestawu reguł.

znanyhuman
źródło
1
Z punktu widzenia gospodarki zasobami jest to najlepsza odpowiedź i nie widzę powodu, dla którego miałoby to działać gorzej niż proponowane metody wymagające znacznie większej ilości danych.
Projekt Chthonic
3

@Nathan Long: Pobieranie Wikipedii nie jest w rzeczywistości złym pomysłem. Wszystkie obrazy, filmy i inne media nie są potrzebne.

Napisałem (kiepski) program w php i javascript (!), Aby przeczytać całą szwedzką wikipedię (lub przynajmniej wszystkie arkusze, do których można było dotrzeć z artykułu o matematyce, który był początkiem mojego pająka).

Zebrałem wszystkie słowa i linki wewnętrzne w bazie danych, a także śledziłem częstotliwość każdego słowa. Teraz używam tego jako bazy danych słów do różnych zadań: * Znajdowanie wszystkich słów, które można utworzyć z podanego zestawu liter (w tym symboli wieloznacznych) * Utworzono prosty plik składni dla języka szwedzkiego (wszystkie słowa, których nie ma w bazie, są uważane za nieprawidłowe).

Aha, a pobranie całej wiki zajęło około tygodnia, używając mojego laptopa działającego przez większość czasu, z połączeniem 10Mbit.

Kiedy już to zrobisz, zapisz wszystkie wystąpienia, które są niezgodne z językiem angielskim i zobacz, czy niektóre z nich są błędami. Idź, napraw je i daj coś społeczności.

Per Alexandersson
źródło
2

Zauważ, że istnieją różnice między dialektami amerykańskimi i brytyjskimi, na co zwróciła uwagę Grammar Girl w swoim odcinku A Versus An .

Jedną z komplikacji jest sytuacja, gdy słowa są wymawiane inaczej w brytyjskim i amerykańskim angielskim. Na przykład słowo oznaczające określony rodzaj rośliny wymawia się jako „erb” w amerykańskim angielskim i „herb” w brytyjskim angielskim. W rzadkich przypadkach, gdy jest to problem, użyj formularza, którego oczekuje się w twoim kraju lub u większości czytelników.

Jan Aagaard
źródło
2

Spójrz na język Perla Lingua :: EN :: Inflect . Zobacz sub _indef_articlew kodzie źródłowym.

Sinan Ünür
źródło
Wyjątki znajdują się w odmianach. T. Wydaje mi się, że lista jest raczej niepełna.
Jan Aagaard
1

Czy możesz dostać słownik języka angielskiego, który przechowuje słowa zapisane w naszym zwykłym alfabecie i międzynarodowym alfabecie fenetycznym ?

Następnie użyj fenetyki, aby dowiedzieć się, jak brzmi początek słowa, a zatem czy „a” lub „an” jest właściwe?

Nie jestem pewien, czy rzeczywiście byłoby to łatwiejsze (lub równie zabawne jak) statystyczne podejście Wikipedii.

Paul D. Waite
źródło
0

Użyłbym algorytmu opartego na regułach, aby objąć jak najwięcej, a następnie skorzystałbym z listy wyjątków. Jeśli chcesz się spodobać, możesz spróbować określić nowe „reguły” z listy wyjątków.

AL Flanagan
źródło
0

Po prostu wygląda jak zestaw heurystyk. Musi być trochę bardziej skomplikowane i odpowiedzieć na kilka rzeczy, na które nigdy nie dostałem dobrej odpowiedzi, na przykład jak traktujesz skróty („RPM” lub „RPM”? Zawsze myślałem, że to drugie ma więcej sensu).

Szybkie wyszukiwanie zaowocowało w bibliotekach lingwistycznych, które mówią o tym, jak radzić sobie z angielskim przedrostkiem liczby pojedynczej, ale prawdopodobnie możesz znaleźć coś, jeśli wystarczająco się zagłębisz. A jeśli nie - zawsze możesz napisać własną bibliotekę fleksji i zdobyć światową sławę :-).

Guss
źródło
Skróty takie jak RPM nie stanowią problemu. Jak mówisz, można je traktować w dowolny sposób. Dlatego rozwiązanie jest oczywiste: zignoruj ​​je.
Andrew J. Brehm
Nie zgodziłbym się, ponieważ powoduje to niespójne przedrostki. Zignorowanie go spowodowałoby „RPM” i „UGC”, co jest ewidentnie błędne.
Guss
0

Nie przypuszczam, że możesz po prostu wypełnić kilka rzeczy z płyty kotłowej, takie jak „a / an”, jako jednoetapową okładkę. W przeciwnym razie wystąpią błędy w założeniach, takie jak wszystkie słowa z „h”, a następnie „o” uzyskaj „an” zamiast „a” jak „dom” - (dom?). Zasadniczo skończysz z włączeniem logiki języka angielskiego lub od czasu do czasu znajdziesz rzadkie przypadki, które sprawią, że będziesz wyglądać głupio.


źródło
0

Sprawdź, czy słowo zaczyna się od samogłoski czy potęgi. „U” jest generalnie spółgłoską i samogłoską („yu”), dlatego w naszych celach należy do grupy spółgłosek.

Litera „h” oznacza stopę gottal (spółgłoskę) w języku francuskim i we francuskich słowach używanych w języku angielskim. Możesz sporządzić ich listę (w rzeczywistości wystarczające mogą być „honor”, ​​„honor” i „godzina”) i policzyć je jako zaczynające się od samogłosek (ponieważ angielski nie rozpoznaje zwarcia krtaniowego).

Policz także „eu” jako spółgłoskę itp.

To nie jest zbyt trudne.

Andrew J. Brehm
źródło
0

wybór lub a zależy od sposobu wymowy słowa. Patrząc na słowo, nie możesz koniecznie określić jego poprawnej wymowy, np. Żargonu lub skrótu itp. Jednym ze sposobów może być posiadanie słownika z obsługą fonemów i używanie informacji o fonemach związanych ze słowem do określenia, czy "a należy użyć „lub”.

Rohin
źródło
0

Nie jestem pewien, czy zawiera odpowiednie informacje, aby rozróżnić „a” i „an”, ale baza danych WordNet firmy Princeton istnieje właśnie w celu wykonywania podobnych zadań, więc myślę, że dane tam są . Zawiera dziesiątki tysięcy słów i setki tysięcy powiązań między tymi słowami (IIRC; nie mogę znaleźć aktualnych statystyk na stronie). Spójrz na to. Można go bezpłatnie pobrać.

rmeador
źródło
0

W jaki sposób? A kiedy? Pobierz rzeczownik z załączonym przedimkiem. Poproś o to w określonej formie.

Zapytaj o rzeczownik w przedimku. Wiele baz kodu MUD przechowuje elementy jako informacje składające się z:

  • jedno lub więcej słów kluczowych
  • krótki formularz
  • długi formularz

Forma słowa kluczowego może brzmieć „krótki zardzewiały miecz”. Krótka forma to „miecz”. Długa forma będzie „zardzewiałym krótkim mieczem”.

Piszesz usługę internetową typu „a vs.”? Cofnij się o krok i sprawdź, czy możesz zaatakować ten wyciek dalej w górę strumienia. Możesz zbudować tamę, ale jeśli nie zatrzymasz jej przepływu, w końcu się rozleje.

Określ, jak ważne jest to i jak sugerowali inni, wybierz „szybki, ale prymitywny” lub „drogi, ale wytrzymały”.

maxwellb
źródło
0

Zasada jest bardzo prosta. Jeśli następne słowo zaczyna się od dźwięku samogłoski, użyj „an”, jeśli zaczyna się od spółgłoski, użyj „a”. Trudne jest to, że nasza szkolna klasyfikacja samogłosek i spółgłosek nie działa. Litera „h” w słowie „honor” jest samogłoską, ale „h” w wyrazie „szpital” jest spółgłoską.

Co gorsza, niektóre słowa, takie jak „szczery”, zaczynają się od samogłoski lub spółgłoski, w zależności od tego, kto je wypowiada. Co gorsza, niektóre słowa zmieniają się w zależności od słów wokół nich dla niektórych mówców.

Problem jest ograniczony tylko tym, ile czasu i wysiłku chcesz w to włożyć. Możesz napisać coś w parze, używając „aeiou” jako samogłosek w ciągu kilku minut lub możesz spędzić miesiące na analizie językowej grupy docelowej. Pomiędzy nimi jest ogromna liczba heurystyk, które będą dobre dla niektórych mówców, a złe dla innych - ale ponieważ różni mówcy mają różne określenia dla tego samego słowa, po prostu nie można mieć racji przez cały czas, bez względu na to, jak się zachowujesz to.

KayEss
źródło
0

Idealnym podejściem byłoby znalezienie w Internecie miejsca, w którym można uzyskać odpowiedzi, dynamicznie je przesyłać i zapisywać w pamięci podręcznej. Na początek możesz wypełnić system kilkuset słowami.

(Nie znam takiego źródła internetowego, ale nie zdziwiłbym się, gdyby takie istniało).

Hot Licks
źródło
0

Tak więc rozsądne rozwiązanie jest możliwe bez pobierania całego internetu. Oto co zrobiłem:

Pamiętałem, że Google opublikował swoje surowe dane dotyczące częstotliwości Google Books N-Gram tutaj . Więc ściągnąłem 2-gramowe pliki dla "a_" i "an". To około 26 koncertów, jeśli dobrze pamiętam. Na tej podstawie stworzyłem listę strun, w których były one przeważnie poprzedzone przeciwnym artykułem, którego można by się spodziewać (gdybyśmy oczekiwali, że samogłoski przyjmują „an”). Ostateczna lista słów, które udało mi się zapisać w mniej niż 7 kilobajtach.

IngisKahn
źródło
-2

Używasz „a”, gdy następne słowo nie jest samogłoską? I używasz „an”, gdy występuje samogłoska?

Mając to na uwadze, czy nie mógłbyś po prostu wykonać wyrażenia regularnego, takiego jak „a \ s [a, e, i, o, u]. *”? A następnie zamień go na „an?”

Daniel
źródło
Nie, ponieważ reguła dotyczy dźwięków samogłosek , a nie liter samogłosek . „Użytkownik” zaczyna się od samogłoski, ale wymowa nie.
Joris Groosman