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
c#
nlp
linguistics
ryeguy
źródło
źródło
Odpowiedzi:
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
AvsAn
w 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:
... co tylko podkreśla, że system oparty na regułach byłby trudny do zbudowania!
źródło
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.
źródło
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.
źródło
hawr-uh-buhl
zawsze mnie rozśmiesza.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 ...
źródło
Ponieważ „a” i „an” są określane przez reguły fonetyczne, a nie konwencje pisowni, prawdopodobnie zrobiłbym to w ten sposób:
źródło
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 :
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.
źródło
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ł.
źródło
@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.
źródło
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 .
źródło
Spójrz na język Perla Lingua :: EN :: Inflect . Zobacz
sub _indef_article
w kodzie źródłowym.źródło
Przeportowałem funkcję z Pythona (pierwotnie z pakietu CPAN Lingua-EN-Inflect), która poprawnie określa dźwięki samogłosek w C # i opublikowałem ją jako odpowiedź na pytanie Programmatycznie określić, czy opisać obiekt za pomocą a, czy? . Możesz zobaczyć fragment kodu tutaj .
źródło
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.
źródło
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.
źródło
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ę :-).
źródło
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
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.
źródło
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”.
źródło
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ć.
źródło
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:
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”.
źródło
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.
źródło
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).
źródło
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.
źródło
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?”
źródło