Разделите предложение на отдельные слова

Я должен разделить китайское предложение на отдельные слова. Проблема с китайским языком состоит в том, что нет никаких пробелов. Например, предложение может быть похожим: 主楼怎么走 (с пробелами это было бы: 主楼 怎么 走).

В данный момент я могу думать об одном решении. У меня есть словарь с китайскими словами (в базе данных). Сценарий будет:

  1. попытайтесь найти первые два символа предложения в базе данных (主楼),

  2. если 主楼 на самом деле слово, и это находится в базе данных, сценарий попытается найти сначала три символа (主楼怎). 主楼怎 не слово, таким образом, это не находится в базе данных =>, мое приложение теперь знает это 主楼 отдельное слово.

  3. попытайтесь сделать это с остальной частью символов.

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

Там какие-либо другие решения к этому?

13
задан Nazim Kerimbekov 1 April 2019 в 13:57
поделиться

9 ответов

Спасибо всем для вас!

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

  1. класс PHP ( http://www.phpclasses.org/browse/package/2431.html )

  2. Модуль Drupal, в основном другое решение PHP с 4 различными алгоритмами сегментации (довольно легко Чтобы понять, как это работает) ( http://drupal.org/project/csplitter )

  3. Расширение PHP для сегментации китайского слова ( http://code.google.com/p / phpcws / )

  4. Есть некоторые другие решения, если вы попробуете поиск Baidu.com для «中文 分词»

искренне,

EQU

6
ответ дан 2 December 2019 в 01:57
поделиться

Вы можете потребоваться рассмотреть возможность использования структуры данных TRIE . Вы сначала построите TRIE из словаря, а затем поиск действительных слов будет намного быстрее. Преимущество определяет, если вы находитесь в конце слова или должны продолжать искать более длинные слова очень быстро.

2
ответ дан 2 December 2019 в 01:57
поделиться

У вас есть входной текст, предложение, абзац все равно. Таким образом, да, ваша обработка ее будет , нужно , чтобы запросить вашу БД для каждой проверки.

С приличной индексацией на колонке слова у вас не должно быть слишком много проблем.

Сказав это, насколько велик этот словарь? В конце концов, вам понадобятся только слова, а не их определения, чтобы проверить, является ли это действительное слово. Так что, если вообще возможно (в зависимости от размера), имея огромную карту памяти / hashtable / словарь с лишним ключами (фактические слова), может быть вариантом и будет быстро, как молния.

В 15 миллионах слов, скажем, средние 7 символов @ 2 байта каждый разрабатывает около 200 мегабайт. Не слишком сумасшедший.

Отредактируйте: в «Только» 1 миллион слов, вы смотрите всего за 13 мегабайт, скажем, 15 с некоторыми накладными расходами. Это не мозговой, я бы сказал.

1
ответ дан 2 December 2019 в 01:57
поделиться

Ну, если у вас есть база данных со всеми словами, и нет другого способа получить эти слова, я думаю, вы вынуждены переинтересовать базу данных.

0
ответ дан 2 December 2019 в 01:57
поделиться

Для улучшения производительности, разве вы не можете сделать все эти проверки перед тем, как вставить предложение в базу данных, и добавить пробелы сами?

0
ответ дан 2 December 2019 в 01:57
поделиться

Вы можете построить очень длинное регулярное выражение.

Редактировать: Я хотел создать его автоматически со сценарием из БД. Не писать это рука.

-3
ответ дан 2 December 2019 в 01:57
поделиться

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

Чтобы сделать это хорошо, вам обычно нужно будет использовать статистическую модель, построенную, запущенную систему обучения машины на довольно большом тренировочном корпусе. Несколько из систем вы можете найти в Интернете, поставляются с предварительно обученными моделями.

-1
ответ дан 2 December 2019 в 01:57
поделиться

(используется ABCDE для обозначения китайских иероглифов для простоты)

Допустим, у вас есть ввод «предложение» ABCDE , и ваш словарь содержит эти слова, которые начинаются с A : AB , ABC , AC , AE и ABB . Предположим, что слово CDE существует, но не DE или E .

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

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

AB  ?= AB : True
ABC ?= ABC: True
AC  ?= AB : False
AE  ?= AB : False
ABB ?= ABC: False

На этом этапе программа разветвляет две найденные «истинные» ветви. В первом случае он предполагает, что первым словом является AB , и пытается найти слова, начинающиеся с C . CDE найден, поэтому такое ветвление возможно. Внизу другой ветви, ABC является первым словом, но DE невозможно, поэтому эта ветвь недействительна, то есть первое должно быть истинной интерпретацией.

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

0
ответ дан 2 December 2019 в 01:57
поделиться

Я понимаю, что проблема сегментации китайских слов очень сложна, но в некоторых случаях может быть достаточно тривиального алгоритма: поиск самого длинного слова, начиная с i-го символа, затем снова поиск i+length(w)-го символа.

Вот реализация на Python:

#!/usr/bin/env python
# encoding: utf-8

import re
import unicodedata
import codecs

class ChineseDict:

    def __init__(self,lines,rex):
        self.words = set(rex.match(line).group(1) for line in lines if not line.startswith("#"))
        self.maxWordLength = max(map(len,self.words))

    def segmentation(self,text):
        result = []
        previousIsSticky = False
        i = 0
        while i < len(text):
            for j in range(i+self.maxWordLength,i,-1):
                s = text[i:j]
                if s in self.words:
                    break
            sticky = len(s)==1 and unicodedata.category(s)!="Lo"
            if previousIsSticky or (result and sticky):
                result[-1] += s
            else:
                result.append(s)
            previousIsSticky = sticky
            i = j
        return u" | ".join(result)

    def genWords(self,text):
        i = 0
        while i < len(text):
            for j in range(i+self.maxWordLength,i,-1):
                s = text[i:j]
                if s in self.words:
                    yield s
                    break
            i = j


if __name__=="__main__":
    cedict = ChineseDict(codecs.open("cedict_ts.u8",'r','utf-8'),re.compile(r"(?u)^.+? (.+?) .+"))
    text = u"""33. 你可以叫我夏尔
    戴高乐将军和夫人在科隆贝双教堂村过周末。星期日早晨,伊冯娜无意中走进浴室,正巧将军在洗盆浴。她感到非常意外,不禁大叫一声:“我的上帝!”
    戴高乐于是转过身,看见妻子因惊魂未定而站立在门口。他继续用香皂擦身,不紧不慢地说:“伊冯娜,你知道,如果是我们之间的隐私,你可以叫我夏尔,用不着叫我上帝……”
    """
    print cedict.segmentation(text)
    print u" | ".join(cedict.genWords(text))

Последняя часть использует копию словаря CCEDICT для сегментации (упрощенного) китайского текста на два варианта (соответственно, с несловосочетаниями и без них):

33. 你 | 可以 | 叫 | 我 | 夏 | 尔
    戴高乐 | 将军 | 和 | 夫人 | 在 | 科隆 | 贝 | 双 | 教堂 | 村 | 过 | 周末。星期日 | 早晨,伊 | 冯 | 娜 | 无意中 | 走进 | 浴室,正巧 | 将军 | 在 | 洗 | 盆浴。她 | 感到 | 非常 | 意外,不禁 | 大 | 叫 | 一声:“我的 | 上帝!”
    戴高乐 | 于是 | 转 | 过 | 身,看见 | 妻子 | 因 | 惊魂 | 未定 | 而 | 站立 | 在 | 门口。他 | 继续 | 用 | 香皂 | 擦 | 身,不 | 紧 | 不 | 慢 | 地 | 说:“伊 | 冯 | 娜,你 | 知道,如果 | 是 | 我们 | 之间 | 的 | 隐私,你 | 可以 | 叫 | 我 | 夏 | 尔,用不着 | 叫 | 我 | 上帝……”

你 | 可以 | 叫 | 我 | 夏 | 尔 | 戴高乐 | 将军 | 和 | 夫人 | 在 | 科隆 | 贝 | 双 | 教堂 | 村 | 过 | 周末 | 星期日 | 早晨 | 伊 | 冯 | 娜 | 无意中 | 走进 | 浴室 | 正巧 | 将军 | 在 | 洗 | 盆浴 | 她 | 感到 | 非常 | 意外 | 不禁 | 大 | 叫 | 一声 | 我的 | 上帝 | 戴高乐 | 于是 | 转 | 过 | 身 | 看见 | 妻子 | 因 | 惊魂 | 未定 | 而 | 站立 | 在 | 门口 | 他 | 继续 | 用 | 香皂 | 擦 | 身 | 不 | 紧 | 不 | 慢 | 地 | 说 | 伊 | 冯 | 娜 | 你 | 知道 | 如果 | 是 | 我们 | 之间 | 的 | 隐私 | 你 | 可以 | 叫 | 我 | 夏 | 尔 | 用不着 | 叫 | 我 | 上帝 
0
ответ дан 2 December 2019 в 01:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: