Разрыв слова в языках без пробелов между словами (например, азиатский)? - PullRequest
16 голосов
/ 22 октября 2009

Я бы хотел, чтобы полнотекстовый поиск MySQL работал с текстом на японском и китайском, а также на любом другом языке. Проблема заключается в том, что эти языки и, возможно, другие языки обычно не имеют пробелов между словами. Поиск бесполезен, когда вы должны ввести то же предложение, что и в тексте.

Я не могу просто поставить пробел между каждым символом, потому что английский тоже должен работать. Я хотел бы решить эту проблему с помощью PHP или MySQL.

Могу ли я настроить MySQL для распознавания символов, которые должны быть их собственными единицами индексации? Есть ли модуль PHP, который может распознавать эти символы, чтобы я мог просто выбросить пробелы вокруг них для индекса?

Обновление

Частичное решение:

$string_with_spaces =
  preg_replace( "/[".json_decode('"\u4e00"')."-".json_decode('"\uface"')."]/",
  " $0 ", $string_without_spaces );

Это делает класс персонажей из, по крайней мере, некоторых из символов, которые мне нужно обработать специально. Наверное, стоит упомянуть, что индексируемый текст допустим.

Кто-нибудь знает все диапазоны символов, которые мне понадобятся для вставки пробелов?

Кроме того, должен быть лучший, переносимый способ представления этих символов в PHP? Исходный код в буквальном Unicode не идеален; Я не узнаю всех персонажей; они могут не отображаться на всех машинах, которые мне приходится использовать.

Ответы [ 2 ]

15 голосов
/ 22 октября 2009

Разрыв слова для упомянутых языков требует лингвистического подхода , например, такого, который использует словарь наряду с пониманием основных основополагающих правил .

Я слышал об относительно успешных приложениях для полнотекстового поиска, которые просто разделяют каждый отдельный символ как отдельное слово на китайском языке, просто применяя ту же «токенизацию» критериев поиска, которые предоставляют конечные пользователи. Поисковая система затем обеспечивает лучшее ранжирование для документов, которые предоставляют символы-слова в том же порядке, что и критерии поиска. Я не уверен, что это может быть распространено на такие языки, как японский, поскольку наборы символов хиракана и катагана делают текст более похожим на европейские языки с коротким алфавитом.

EDIT
Ресурсы
Эта проблема с разбивкой слов, а также связанные с ней проблемы настолько нетривиальны , что о ней написаны целые книги. См., Например, Обработка информации CJKV (CJKV обозначает китайский, японский, корейский и вьетнамский языки; вы также можете использовать ключевое слово CJK, поскольку во многих текстах вьетнамский язык не обсуждается). См. Также Разрыв слова на японском языке трудно для одного пейджера на эту тему.
Понятно, что большая часть материала, охватывающего эту тему, написана на одном из базовых родных языков и, следовательно, имеет ограниченное применение для людей, не владеющих этими языками относительно свободно. По этой причине, а также для того, чтобы помочь вам проверить поисковую систему после того, как вы начнете реализовывать логику средства разбиения по словам, вам следует обратиться за помощью к носителю языка или двум.

Различные идеи
Ваша идея идентификации символов, которые систематически подразумевают разрыв слова (скажем, кавычки, скобки, подобные дефису символы и т. Д.), Хороша, и это, вероятно, одна эвристика, используемая некоторыми средствами разбиения по словам профессионального уровня. Тем не менее, вам следует искать авторитетный источник для такого списка, а не собирать его с нуля, основываясь на неофициальных данных.
Связанная идея состоит в том, чтобы разбить слова на переходах Кана-к-кандзи (но я не думаю, что наоборот), и, возможно, на Хирагана-катакана или наоборот. наоборот переходы.
Независимо от собственно разбиения слов, индекс может [-или, может не-;-)] извлекать выгоду из систематического преобразования каждого, скажем, символа хирагана в соответствующий символ катакана. Просто необразованная идея! Я не знаю достаточно о японском языке, чтобы знать, поможет ли это; интуитивно, это было бы слабо похоже на систематическое преобразование акцентированных букв и так далее в соответствующие не акцентированные буквы, как это практикуется на нескольких европейских языках.

Может быть, идея, о которой я упоминал ранее, о систематической индексации отдельных символов (и ранжировании результатов поиска на основе их порядка следования в соответствии с критериями поиска), может быть слегка изменена, например, путем объединения последовательных символов кана, а затем некоторые другие правила ... и создают несовершенную, но достаточно практичную поисковую систему.

Не разочаровывайтесь, если это не так ... Как уже говорилось, это далеко не тривиально, и в долгосрочной перспективе это может сэкономить вам время и деньги, сделав паузу и прочитав одну или две книги. Еще одна причина, чтобы попытаться узнать больше о «теории» и лучших практиках, заключается в том, что в данный момент вы, кажется, сосредоточены на разрыве слов , но вскоре поисковая система также может извлечь выгоду с стем-осознание ; на самом деле эти две проблемы, по крайней мере лингвистически, связаны и могут быть полезны при решении в тандеме.

Удачи в этом неприятном, но достойном начинании.

1 голос
/ 15 октября 2010

Год спустя, и вам, вероятно, это больше не нужно, но код на следующей странице может иметь некоторые подсказки для того, что вы хотите (ed) сделать:

http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/spamfilter/japanese-tokenizer.el.txt

Если вы добились какого-либо прогресса после вышеупомянутых постов в своем собственном поиске, я уверен, что другие заинтересуются.

(отредактировано, чтобы сказать, что здесь есть лучший ответ: Как классифицировать японские символы как кандзи или кана? )

...