2017-05-07 2 views
1

こんにちは皆さん、私はPythonとRegExを組み合わせて助けが必要です。私は生のテキストをXMLに変換しているプロジェクトに取り組んでいます。このテキストは、さまざまなことを話す複数の人々から構成されています。私がしようとしているのは、スピーチを壊してXMLに変換することです。PythonとRegExは、未フォーマットのテキストファイルからスピーカーとそのスピーチを見つけることができますか?

サンプル文字列は次のとおりです。

氏COX。 Lorem ipsum dolle amet、consectetur adipiscing elit。 Vestibulum sollicitudin vestibulum consectetur。あなたのお名前はあなたの名前であり、あなたの名前はあなたの名前です。 Donecはmagna ac molestieである。 Vivamus sed lacinia lectus、quis feugiat libero。ナム・サピエン・ラクス、ヘンドリート・アット・アット・アット・アウグルテス、ユリfringilla lobortis nulla。 Nulla facilisi。 Lorem ipsum dolle amet、consectetur adipiscing elit。エティアムは効果を発揮する。オーケーは、オーケーに座っています。高齢者、高齢者、高齢者、高齢者、高齢者、高齢者、 Nulla sagittis varius eros、プレチウムアークサスペンションアリコート。 SEABASSさん。ウサギの摂食障害。ドンクは、一時的な、またはポートレートの時間を過ごす。 Aliquam、lelet in aliquet laoreet、sem ante dapibus velit、nec imperdiet felis tellus vel leo。ヌンチャクの熟練した熟練した熟練者。 Nam volutpat vel metus sed aliquam。 Curabitur vitae elit urna。 Nulla vehicula sapien quis libero elementum、vitae sodales tellusコモド。 Pellentesque pulvinar felis vitae neque viverraは、魅力的な環境を提供します。クレイビュール・ロレム・リベロ、モルディス・コンセプチューター・テンポス・アット・アット・アット・アット・イン・アット、 Cras ullamcorper arcu ac orci pharetraという結果が出ました。 Nunc magna justo、sollicitudin in enim vel、volutpat elementum sapien。モーリスは、不完全な時代のファシリティのもとで眠っている。 Praesent consectetur leo a eros mattis tempor。 REXさんNullam interdum urna quis nunc sodales、id posuere nisl malesuada。ナンデンスラクサおよびipsum ultries pharetra。 Nullam vitae mauris sodales、fringilla augue at、効率的アーク。元のサイズ、元のサイズ、サイズ、サイズ、サイズ、サイズなどの情報を入力してください。フューズアウター、懇親会のコンフェレンスコンサルタント、ディラムリベラポルタレクルス、コンサーチトゥーファーニスミーヌニール。即効性と効率性を向上させ、唯一の選択肢を提供する。 Sed rhoncus neque libero、et tempor ipsum imperdiet id。整数値は整数値である。 Etiam risus enim、超高齢者のための耳鼻咽喉科、耳鼻咽喉科。 Nullam tellus metus、ノーバスではない、lobortis imperdiet tortorで。 Nulla nec tortor sagittis、fringilla nisi quis、bibendum leoです。

上記は単なるサンプルに過ぎません。 RegExとPythonのコードは、スピーカーとそのスピーチが書かれたファイル全体を読む必要があります。今、私はすでにスピーカーを見つけるの世話をする正規表現を持って

<Gutenberg> 
<Speaker>Mr. COX</Speaker> 
<Speech>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum sollicitudin vestibulum consectetur. Aliquam rhoncus nisl id velit gravida, quis volutpat est eleifend. Donec posuere a magna ac molestie. Vivamus sed lacinia lectus, quis feugiat libero. Nam sapien lacus, hendrerit at posuere ut, ullamcorper sit amet augue. Ut fringilla lobortis nulla. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur rutrum dictum. Aenean a sem mollis justo scelerisque posuere eget sit amet orci. Praesent condimentum, leo at commodo dapibus, leo mi pretium lectus, et sagittis lorem sapien ut enim. Nulla sagittis varius eros, eget pretium arcu suscipit aliquet. </Speech> 
<Speaker>Mr. SEABASS</Speaker> 
<Speech>Ut condimentum lobortis suscipit. Donec eget tempor ex, vel porttitor velit. Aliquam vulputate, leo in aliquet laoreet, sem ante dapibus velit, nec imperdiet felis tellus vel leo. Nunc mattis velit sed turpis consectetur tempus. Nam volutpat vel metus sed aliquam. Curabitur vitae elit urna. Nulla vehicula sapien quis libero elementum, vitae sodales tellus commodo. Pellentesque pulvinar felis vitae neque viverra posuere vitae sit amet neque. Curabitur lorem libero, mollis consectetur tempus sit amet, tincidunt vitae dolor. Cras ullamcorper arcu ac orci pharetra consequat. Nunc magna justo, sollicitudin at enim vel, volutpat elementum sapien. Mauris sit amet velit in diam imperdiet tempor facilisis et ex. Praesent consectetur leo a eros mattis tempor.</Speech> 
<Speaker>Mr. REX</Speaker> 
<Speech>Nullam interdum urna quis nunc sodales, id posuere nisl malesuada. Nam nec lacus et ipsum ultrices pharetra. Nullam vitae mauris sodales, fringilla augue at, efficitur arcu. Sed ex diam, ullamcorper a auctor eget, volutpat sit amet est. Suspendisse urna eros, ullamcorper in semper at, lobortis eget quam. Fusce auctor, augue sit amet convallis condimentum, diam libero porta lectus, consectetur posuere nisi mi non nulla. Suspendisse vel ante efficitur, eleifend justo sed, lobortis augue. Sed rhoncus neque libero, et tempor ipsum imperdiet id. Integer at purus eget dolor pharetra varius ut et massa. Etiam risus enim, ultrices vitae nisl eu, interdum dignissim tellus. Nullam tellus metus, finibus non justo at, lobortis imperdiet tortor. Nulla nec tortor sagittis, fringilla nisi quis, bibendum leo. </Speech> 
</Gutenberg> 

上記のようなものが得られるはずです。しかし、スピーチにスピーチを合わせるのが難しいです。スピーチとスピーカーは、3つのスピーカーやスピーチではなく、異なっています。 RegExは柔軟性が必要です。

この質問は重複するものではありません。これは、映画のスクリプトに関する参考資料であり、これはプロジェクトのgutenberg eBook用です。

+0

スピーカーを識別するRegExは何ですか? –

+0

投稿した一行の文字列は、あなたが扱っている正確な形式ですか?あなたはどこからこれを取得していますか?私はより広いスピーチサンプルを得ることができますか? –

+0

これは、自然言語処理のための挑戦のように見えます。正規表現ではありません。 – Chris

答えて

2

限られた例の正規表現を提供するのは簡単ですが、信頼性が低く、脆いことは避けられません。 関連性の高いチャンクにある情報を抽出する別の方法が必要です。その理由は、新しいスピーカー/スピーチコンボを識別することを可能にする予測可能なパターンが限られているからです。この場合、Mr. ALLCAPSNAME.は半信頼性の高い唯一の識別子と思われます。これを使用して、言葉にMr|Ms|Mrsの後に全頭文字の単語がある場合、それはブレークポイントと誤解されます。これはそれをトリップするでしょう:

氏ABC。私はABC夫人だと思う。 awsomeです。

はあなたを与えるだろう:

[('Mr. ABC.', 'I think'), ('Mrs. ABC.', 'is awesome.')] 

そして、私は簡単にスピーチ内氏/ MS /ミセスの誰に言及する人を見ることができました。

In [1]: pattern = re.compile(r""" 
      (?<=\b)\s* 
      (?P<Speaker>M(?:rs?|s)\.\s+[A-Z]+\.)\s+ 
      (?P<Speech>.+?\.) 
      (?=\s+M(?:rs?|s)\.\s+[A-Z]+\.|$) 
      """, 
      re.VERBOSE) 
In [1]: pattern.findall(example) 
Out[1]: 
[('Mr. COX.', 
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum sollicitudin vestibulum consectetur. Aliquam rhoncus nisl id velit gravida, quis volutpat est eleifend. Donec posuere a magna ac molestie. Vivamus sed lacinia lectus, quis feugiat libero. Nam sapien lacus, hendrerit at posuere ut, ullamcorper sit amet augue. Ut fringilla lobortis nulla. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur rutrum dictum. Aenean a sem mollis justo scelerisque posuere eget sit amet orci. Praesent condimentum, leo at commodo dapibus, leo mi pretium lectus, et sagittis lorem sapien ut enim. Nulla sagittis varius eros, eget pretium arcu suscipit aliquet.'), 
('Mr. SEABASS.', 
    'Ut condimentum lobortis suscipit. Donec eget tempor ex, vel porttitor velit. Aliquam vulputate, leo in aliquet laoreet, sem ante dapibus velit, nec imperdiet felis tellus vel leo. Nunc mattis velit sed turpis consectetur tempus. Nam volutpat vel metus sed aliquam. Curabitur vitae elit urna. Nulla vehicula sapien quis libero elementum, vitae sodales tellus commodo. Pellentesque pulvinar felis vitae neque viverra posuere vitae sit amet neque. Curabitur lorem libero, mollis consectetur tempus sit amet, tincidunt vitae dolor. Cras ullamcorper arcu ac orci pharetra consequat. Nunc magna justo, sollicitudin at enim vel, volutpat elementum sapien. Mauris sit amet velit in diam imperdiet tempor facilisis et ex. Praesent consectetur leo a eros mattis tempor.'), 
('Mr. REX.', 
    'Nullam interdum urna quis nunc sodales, id posuere nisl malesuada. Nam nec lacus et ipsum ultrices pharetra. Nullam vitae mauris sodales, fringilla augue at, efficitur arcu. Sed ex diam, ullamcorper a auctor eget, volutpat sit amet est. Suspendisse urna eros, ullamcorper in semper at, lobortis eget quam. Fusce auctor, augue sit amet convallis condimentum, diam libero porta lectus, consectetur posuere nisi mi non nulla. Suspendisse vel ante efficitur, eleifend justo sed, lobortis augue. Sed rhoncus neque libero, et tempor ipsum imperdiet id. Integer at purus eget dolor pharetra varius ut et massa. Etiam risus enim, ultrices vitae nisl eu, interdum dignissim tellus. Nullam tellus metus, finibus non justo at, lobortis imperdiet tortor. Nulla nec tortor sagittis, fringilla nisi quis, bibendum leo.')] 

このパターンは、あなたがそれをXMLizeするためにこれを使用することができます動作する場合: が、これは動作しますが、私はそれを信用しないだろう、それを抽出するためのより良い方法を失敗

def to_xml(l): 
    base_element = Element('Gutenburg') 
    speeches = SubElement(base_element, 'Speeches') 

    for speaker, speech in l: 
     sp = SubElement(speeches, 'Speech') 

     s = SubElement(sp, 'Speaker') 
     s.text = speaker 

     text = SubElement(sp, 'Text') 
     text.text = speech 

    return base_element 

その後:

tostring(result) 

あなたのXML文字列は

+0

あなたはテキスト全体にわたって正しく機能しませんでした。しかし、それは私に良い出発点を与えてくれました。 – CodeHard

+0

あなたが提供したテキスト全体に作用しました。もしあなたがそれ以上のデータを持っていれば、それを提供するべきです。私たちはここで最高のデータを考えています –

+0

@CodeHardは私の最後のコメントをチェックします。また少し調整された正規表現とあなたが望むXMLに変換する方法を追加 –

関連する問題