質問

い分ける必要があり、中国の刑期別の言葉です。問題は中国語ではありません。例えば、その文がある: 主楼怎么走 (空間ですることはできない。 主楼 怎么 走).

今、私はを考えることができる一溶液とする。い辞書中国語(データベーススクリプト:

  1. をさがしてみてください最初の文字の文章のデータベース主楼),

  2. の場合 主楼 実際に言葉が使えるのでとても便利です。データベースのスクリプトを探してみて初の三文字(主楼怎). 主楼怎 ではないの単語なデータベースに=>マのアプリケーションと知る 主楼 は、別の言葉です。

  3. いでは文字です。

んですが、このようなアプローチで分析しでも小さなテキストでデータベースに問い合わせが多すぎます。

ある他のソリューションはないのか。

役に立ちましたか?

解決

皆さんに感謝します!

少しの調査の後、私はいくつかの作業ツールを見つけました(すべての提案を念頭に置いて)、だから私は自分の質問に答えています。

  1. PHPクラス(http://www.phpclasses.org/browse/package/2431.html)

  2. Drupalモジュール、基本的に4つの異なるセグメンテーションアルゴリズムを備えた別のPHPソリューション(それがどのように機能するかを非常に理解しやすい)(http://drupal.org/project/csplitter)

  3. 中国語の単語セグメンテーションのPHP拡張機能(http://code.google.com/p/phpcws/)

  4. baidu.comを検索して「中文」を検索してみると、他にもいくつかのソリューションがあります。

心から、

equ

他のヒント

使用を検討することをお勧めします トリー データ構造。最初に辞書からTrieを構築し、有効な単語を検索するとはるかに高速になります。利点は、単語の終わりにいるかどうかを判断すること、またはより長い単語を探し続ける必要があるかどうかは非常に速いことです。

入力テキスト、文、段落は何でもあります。はい、あなたの処理はそうでしょう 必要 チェックごとにDBに対して照会します。

ただし、Word列に適切なインデックス作成がある場合、あまり多くの問題はありません。

そうは言っても、この辞書はどれくらい大きいですか?結局のところ、あなたはそれが有効な単語であるかどうかを確認するための定義ではなく、単語のみが必要になります。したがって、可能な場合は(サイズに応じて)、キー(実際の単語)を備えた巨大なメモリマップ/ハッシュテーブル/辞書がオプションであり、稲妻として迅速になります。

1500万 言葉、平均7文字 @と言う 2バイト それぞれが200メガバイトマークを中心に作業します。あまりクレイジーではありません。

編集: 「わずか」100万語で、あなたは13メガバイトをわずかに超えて見ています。それは私が言うことのない簡単な簡単なことです。

うまく機能するもう1つはです http://www.itgrass.com/phpanalysis/index.html

UTF-8で適切に機能するのは、私が見つけた唯一のものです。残りはGB18030でのみ機能し、後で多くの問題を引き起こしました。私は最初からやり直さなければならないと思っていましたが、これは私に多くの時間を節約しました。

さて、すべての単語を含むデータベースがあり、それらの単語を関与させる他の方法がない場合、データベースを再クエリにすることを余儀なくされていると思います。

これのパフォーマンスを向上させるために、文をデータベースに挿入する前に、これらすべてのチェックを行うことはできませんか?

(使用 ABCDE 簡単にするために漢字を表すため)

あなたが「文」を持っているとしましょう ABCDE 入力、そしてあなたの辞書には、から始まるこれらの単語が含まれています a: ab, ABC, 交流, AE, 、 と abb. 。そして、その言葉を想定しています CDE 存在するが、 de, 、 または e しない。

入力文を解析するとき、左から右に進むと、スクリプトは最初の文字を引っ張ります a. 。データベースをクエリする代わりに、かどうかを確認します a 単語です。データベースを照会して、から始まるすべての単語をプルします a.

これらの結果をループして、入力文字列から次の数文字をつかんで適切な比較を取得します。

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

この時点で、プログラムは、見つけた2つの「真の」ブランチを分岐します。最初に、それは推測します ab 最初の言葉であり、見つけようとします c- 単語の開始。 CDE ブランチが可能になるため、見つかります。他のブランチを下る、 ABC 最初の言葉ですが、 de 不可能なので、ブランチは無効です。つまり、最初は真の解釈でなければなりません。

この方法では、データベースへの呼び出しの数が最小限に抑えられたと思います(ただし、同じ文字で始まる単語のセットを取得するため、データベースから大きなセットを返す可能性があります)。この種の検索のためにデータベースがインデックス付けされている場合、これは手紙に渡るよりもうまくいくと思います。今、このプロセス全体と他の答えを見ると、これは実際にはトライ構造だと思います(検索されたキャラクターが木の根元であると仮定します)。さて、ここにそのアイデアの実装があります!

中国語の単語セグメンテーションの問題は非常に複雑な問題であることを理解していますが、場合によっては、この些細なアルゴリズムで十分かもしれません:ith文字から始まる最長の単語wを検索してから、i+length(w)th文字のためにもう一度起動します。

これが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辞書 (単純化された)中国のテキストを2つのフレーバーにセグメント化するには(単語以外の文字の有無にかかわらず)。

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

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

の良い、高速道セグメント中国語テキストは最大マッチング分割、基本的には、試験の異なる長さの言葉を組み合わせ区分が最も可能性が高い。この一覧はできる言葉です。

詳細はこちら: http://technology.chtsai.org/mmseg/

この方法を使用している私读者(DuZhe)テキスト分析装置( http://duzhe.aaginskiy.com ).利用しないデータベース、実は、私はプリロードの一覧単語配列になプ~約2MBのメモリで実行します。

ごみを使用語彙分以上の統計をも統計的な手法で正確については、97%に研究所)は、非常に良い分割ツールADSOtransることで、できるだけ早く送ってくださ http://www.adsotrans.com

このデータベースが冗長テーブルの区分によるものです。でも提供することができ文法定義を支援する区分によるものです。

これは、計算言語学のかなり標準的なタスクです。 「トークン化」または「単語セグメンテーション」という名前です。 「中国語の単語セグメンテーション」または「中国のトークン化」を検索してみてください。このタスクを行うために作成されたいくつかのツールと、それを行うための研究システムに関する論文を見つけることができます。

これをうまく行うには、通常、かなり大きなトレーニングコーパスで機械学習システムを実行することで構築された統計モデルを使用する必要があります。 Webで見つけることができるいくつかのシステムには、事前に訓練されたモデルが付属しています。

非常に長い正規表現を構築できます。

編集:私はDBからのスクリプトで自動的にそれを構築するつもりでした。手で書くことはありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top