22

Mr. and Dr. や USA などのケースを考慮して、段落または大量のテキストをどのように文に分割しますか (できれば Ruby を使用)。(文を配列の配列に入れるだけだと仮定します)

更新: 私が考えた解決策の 1 つは、品詞タガー (POST) と分類子を使用して文の終わりを判断することです。

ジョーンズ氏からデータを入手した彼は、イタリアの夏の別荘のバルコニーに出たとき、顔に暖かい日差しを感じました。彼は生きていて幸せでした。

CLASSIFIER Mr./PERSON ジョーンズ/PERSON は感じた/おお/おあたたかい/おお太陽/お上に/おおお彼/お顔/おおとして/おおお彼は/おおお/お外へ/おおお上へ/おおおバルコニー/おお/O 彼の/O 夏/O 家/O in/O イタリア/LOCATION ./O 彼/O は/O 幸せだった/O to/O be/O 生きている/O ./O

POST Mr./NNP ジョーンズ/NNP フェルト/VBD the/DT warm/JJ sun/NN on/IN his/PRP$ face/NN as/IN he/PRP stepped/VBD out/RP on/IN the/DT バルコニー/ NN of/IN his/PRP$ summer/NN home/NN in/IN Italy./NNP He/PRP was/VBD happy/JJ to/TO be/VB alive./IN

イタリアが場所なので、ピリオドが文の有効な末尾であると仮定できますか? 「さん」で終わるので。他の品詞がない場合、これは有効な文末期間ではないと仮定できますか? これは私の質問に対する最良の答えですか?

考え?

4

14 に答える 14

13

Stanford Parserの Ruby ラッパーを調べてみてください。getSentencesFromString() 関数があります。

于 2009-05-14T14:35:57.360 に答える
8

明確にするために、それに対する簡単な解決策はありません。これは、簡単な Google 検索が示すように、NLP 研究のトピックです。

ただし、文章検出をサポートする NLP を扱うオープン ソース プロジェクトがいくつかあるようで、次の Java ベースのツールセットを見つけました。

openNLP

追加コメント: 文の開始位置と終了位置を決定する問題は、自然言語処理における文境界明確化(SBD)とも呼ばれます。

于 2009-05-13T23:13:17.220 に答える
6

このルビーの宝石がうまくいくようです。

https://github.com/zencephalon/Tactful_Tokenizer

于 2010-05-06T16:03:03.373 に答える
5

NLTK(Natural Language Tool Kit)のPythonセンテンススプリッターを見てください。

パンクセンテンストークナイザー

これは、次の論文に基づいています。

Kiss、Tibor and Strunk、Jan(2006):教師なし多言語文の境界検出計算言語学32:485-525。

この論文のアプローチは非常に興味深いものです。それらは、文の分割の問題を、単語が句読点に続くことにどれほど強く関連しているかを決定する問題に減らします。略語の後のピリオドのオーバーロードは、あいまいなピリオドのほとんどの原因であるため、略語を識別できれば、文の境界を高い確率で識別できます。

私はこのツールを少し非公式にテストしましたが、さまざまな(人間の)言語で良い結果が得られるようです。

それをRubyに移植することは簡単ではありませんが、それはあなたにいくつかのアイデアを与えるかもしれません。

于 2009-05-25T21:22:07.690 に答える
4

あなたが本当にそれを正しくすることに関心があるなら、これは難しい問題です。おそらく、NLP パーサー パッケージがこの機能を提供していることがわかります。より高速なものが必要な場合は、トークンのウィンドウの訓練された確率関数を使用して、その機能の一部を複製する必要があります (おそらく、改行をトークンとしてカウントする必要があります。段落の終わりです)。

編集: Java を使用できる場合は、スタンフォード パーサーをお勧めします。他の言語を推奨するものはありませんが、他に何がオープン ソースであるかを聞くことに非常に興味があります。

于 2009-05-13T23:13:44.567 に答える
2

受け入れられた答えに同意します。Stanford Core NLP を使用することは非常に簡単です。

ただし、2016年には、スタンフォードパーサーとスタンフォードコアnlpの新しいバージョンとのインターフェースにいくつかの非互換性があります(スタンフォードコアNLP v3.5に問題がありました)。

これは、スタンフォードコアNLPとインターフェースするRubyを使用してテキストを文に解析するために私がしたことです:

  1. スタンフォード CoreNLP gemをインストールします。

gem install stanford-core-nlp

  1. 次に、スタンフォード CoreNLP の最新バージョンを使用するための readmeの手順に従います。

スタンフォード CoreNLP の最新バージョン (2014 年 10 月 31 日現在のバージョン 3.5.0) を使用するには、いくつかの追加の手動手順が必要です。

  • http://nlp.stanford.edu/からStanford CoreNLP バージョン 3.5.0をダウンロードします。

  • 解凍したアーカイブの内容を stanford-core-nlp gem の /bin/ フォルダー (例: [...]/gems/stanford-core-nlp-0.x/bin/) または構成されたディレクトリの場所に配置します。 StanfordCoreNLP.jar_path を設定します。

  • 完全な Stanford Tagger バージョン 3.5.0http://nlp.stanford.edu/からダウンロードします。

  • stanford-core-nlp gem の /bin/ フォルダー内 (例: [...]/gems/stanford-core-nlp-0.x/bin/) または によって構成されたディレクトリ内に「taggers」という名前のディレクトリを作成します。 StanfordCoreNLP.jar_path を設定します。

  • 抽出したアーカイブの内容を taggers ディレクトリ内に配置します。

  • https://github.com/louismullie/stanford-core-nlpからbridge.jar ファイルをダウンロードします。

  • ダウンロードした bridger.jar ファイルを stanford-core-nlp gem の /bin/ フォルダー内 (例: [...]/gems/stanford-core-nlp-0.x/bin/taggers/) またはディレクトリ内に配置します。 StanfordCoreNLP.jar_path を設定して構成します。

次に、テキストを文に分割する Ruby コード:

require "stanford-core-nlp"

#I downloaded the StanfordCoreNLP to a custom path:
StanfordCoreNLP.jar_path = "/home/josh/stanford-corenlp-full-2014-10-31/"
  
StanfordCoreNLP.use :english
StanfordCoreNLP.model_files = {}
StanfordCoreNLP.default_jars = [
  'joda-time.jar',
  'xom.jar',
  'stanford-corenlp-3.5.0.jar',
  'stanford-corenlp-3.5.0-models.jar',
  'jollyday.jar',
  'bridge.jar'
]

pipeline =  StanfordCoreNLP.load(:tokenize, :ssplit)

text = 'Mr. Josh Weir is writing some code. ' + 
  'I am Josh Weir Sr. my son may be Josh Weir Jr. etc. etc.'
text = StanfordCoreNLP::Annotation.new(text)
pipeline.annotate(text)
text.get(:sentences).each{|s| puts "sentence: " + s.to_s}
  
#output:
#sentence: Mr. Josh Weir is writing some code.
#sentence: I am Josh Weir Sr. my son may be Josh Weir Jr. etc. etc.
于 2016-12-27T02:48:34.843 に答える
1

JAVA を検討している場合は、マニング博士の回答が最も適切です (そして、Ruby も大変です ;))。ここです-

センテンス スプリッターがあります: edu.stanford.nlp.process.DocumentPreprocessor 。次のコマンドを試してください: java edu.stanford.nlp.process.DocumentPreprocessor /u/nlp/data/lexparser/textDocument.txt

oneTokenizedSentencePerLine.txt . (これは (良いがヒューリスティックな) FSM を介して行われるため、高速です。確率論的パーサーを実行していません。)

ただし、コマンド java edu.stanford.nlp.process.DocumentPreprocessor /u/nlp/data/lexparser/textDocument.txt > oneTokenizedSentencePerLine.txt TO java edu.stanford.nlp.process.DocumentPreprocessor -file /uを変更する場合のちょっとした提案 /nlp/data/lexparser/textDocument.txt > oneTokenizedSentencePerLine.txt . 入力として提示されるファイルの種類を指定する必要があるため、問題なく機能します。つまり、テキスト ファイルの場合は -file、HTML の場合は -html などです。

于 2011-02-23T11:52:19.787 に答える
1

ピリオド、スペース、大文字で分割してみてはいかがでしょうか。大文字を見つける方法はわかりませんが、それは私が見始めるパターンです。

編集: Rubyで大文字を見つける.

別の編集:

大文字で始まらない単語に続く文末の句読点をチェックします。

于 2009-05-13T22:53:03.603 に答える
0

私はRubyの男ではありませんが、分割された正規表現です

 ^(Mr|Mrs|Ms|Mme|Sta|Sr|Sra|Dr|U\.S\.A)[\.\!\?\"] [A-Z]

段落を取得したら(\ r \ nで分割)、私の最善の策です。これは、文が適切に区別されていることを前提としています。

明らかに、これはかなり醜い正規表現です。文の間に2つのスペースを強制するのはどうですか

于 2009-05-13T22:53:02.027 に答える
0

ピリオドの後にスペースと大文字が続くと、"Mr. Brown" のようなタイトルにはなりません。

ピリオドは物事を難しくしますが、感嘆符と疑問符は扱いやすいケースです。ただし、これが機能しない場合があります。つまり、Yahoo! の会社名です。

于 2009-05-13T22:53:18.000 に答える
0

まあ、明らかparagraph.split('.')にそれをカットしません

#split答えとして正規表現を取るので、ゼロ幅の後読みを使用して、大文字で始まる単語をチェックしてみてください。もちろん、これは固有名詞で分割されるため、/(Mr\.|Mrs\.|U\.S\.A ...)プログラムで正規表現を構築しない限り、このような正規表現に頼らなければならない場合があります。

于 2009-05-13T22:57:41.457 に答える
0

これは必ずしも解決できるとは限りませんが、「.」(ピリオドの後に空白が続く) に基づいて分割し、ピリオドの前の単語が Mr、Dr などの単語のリストに含まれていないことを確認できます。

しかし、もちろん、あなたのリストはいくつかの単語を省略している可能性があり、その場合、悪い結果が得られます.

于 2009-05-13T22:59:35.307 に答える