2017-04-19 10 views
0

初めての投稿はこちら私は、私がテキスト分析に関して達成しようとしていることについて少し助けを見つけることができればと願っています。テキストブロック内の[名前のリストからの任意の名前] + [特定の姓]をカウントするにはどうすればよいですか?

まず、私はこれをPythonでやっていますが、この機能は私が満足しているより大きな、そうでなければ健全なツールの一部になるので、Pythonにとどまりたいと思います。 NLKTとAnacondaもすべてセットアップされているので、これらのリソースを利用することも可能です。

私は、大きなテキストブロックの都市名への参照を追跡して追加するツールに取り組んできました。たとえば、「シカゴ」、「ニューヨーク」、「ロサンゼルス」、「サンフランシスコ」などがテキストチャンクで検出され、ランク付けされる回数を計測することができます。

私が抱えている現在の問題は、姓でもある都市名から誤検出を除去する方法を考え出すことです。例えば、Jackson Mississippiとは数えたいが、 "Frank Jackson" "Jane Jackson"などは数えたくない。

私は何をしたいのですか? [名字の長いリストからの任意の名前] + [姓の選択]である可能性があります。

センサスのデータから〜5000のファーストネームのリストを集めました。これをリストとしてPythonに取り込むこともできます。また、真/偽をチェックしてその名前がそのリストにあるかどうかを調べることができるので、私が近づいていることを知ることができます。

しかし、私が把握することはできませんすることは(私は再び例としてジャクソンを使用します)のようなものである、私が欲しいものを表現する方法である:

totalfirstnamejacksoncount = count (“[any name from census list] + Jackson”) 

多かれ少なかれ。国勢調査のリストからワイルドカードとして使うことができますか? "anynamevariable + Jackson"に行くことができるように、 "このリスト内の項目"として読み込む変数を設定します。あるいは、「国勢調査リスト+ジャクソン」のような言葉を表す他の方法はありますか?

理想的には、「[任意のファーストネーム] + [指定された姓]」の合計数を得ることが理想です。a)[都市名でもある姓]おそらく他のいくつかの細分化のためにそのカウントを使用します。

センサスのリストを直接変更して、ジャクソン(または私が必要とする姓)を各名前に追加して行を手作業で追加する方法を見ることができますが、私がしたいと思っているそれぞれの名前の〜5000の名前を見ると、私のコードの完全な混乱。

長すぎる投稿を申し訳ありません。私はこのすべてをあなたの助けに感謝します。もしあなたが他の提案をしていると思うなら、私はそれにアプローチするより良い方法かもしれないと思います。

+1

NLTKは最初に収集したリストよりも完成度の高い、〜8,000の英語名のリストを持つコーパスnltk.corpus.namesを特徴としています。 – DyZ

+0

"Jackson"のすべてのインスタンスに先行する単語のリストを作成し、それをループしてnltk.corpus.namesに入っているかどうかを確認できますか? – Dwaxe

+0

私はコンコーダンスを作成し、コーパスのリストから名前を調べることを考えましたが、NLTKのコンコーダンスを変数に出力するという問題があります。一致の長さは、名前を捕まえることができるようにするが、捕まえることはできません。私はちょうど私が行くことができれば(このリストのどれか+ "ジャクソン")最も簡単な方法かもしれないように私がこれのように見えると思った。また、NLTKの名前リストを指摘してくれてありがとう。それは、ファーストネームを組み立てるより良い方法かもしれません。 – newreadia

答えて

0

正規表現をNLTKの名前リストと組み合わせて使用​​することを提案します。あなたのテキストがあるとします:分離」の場合にはあなたが正規表現に慣れていない

jackson_names = re.compile("|".join(w + r"\s+" + "Jackson" \ 
          for w in nltk.corpus.names.words())) 

r'\s+'手段:

text = "I met Fred Jackson and Mary Jackson in Jackson Mississippi" 

は、すべての名前のリストを取り、(巨大な)正規表現でそれを変換します1つ以上の空白で区切られています。 ""|"は" or "を意味します。正規表現を拡張して、他の姓を扱うことができます。今

、テキストからすべての「ジャクソン」の試合を抽出:

jackson_catch = jackson_names.findall(text) 
#['Fred Jackson', 'Mary Jackson'] 
len(jackson_catch) 
#2 
+1

これは素晴らしく機能します!これについてあなたの助けをありがとうございました。私はちょうどそれをテストし、私はすでにそれを稼働させている。 – newreadia

0

をのは、例えば、あなたが言葉を反復して、データを操作することが可能であると仮定してみましょう

など
s = 'Hello. I am a string.' 
s.split() 
Output: ['Hello.', 'I', 'am', 'a', 'string.'] 

、あなたは句読点を排除することにより、単語を正規化するために管理している、大文字と小文字、

だから、言葉words_list(あなたのテキストはリストに変換する)とインデックスiでのリストを持っていますあなたは都市名があるかもしれないと思うか、またはそれは都市名として誤って識別された人の姓であるかもしれません。ファーストネームのリストをFIRST_NAMESと呼びましょう。タイプはsetです(コメントを参照)。

if i >= 1: 
    prev_word = words_list[i-1] 
    if prev_word in FIRST_NAMES: 
    # put false positive code here 
    else: 
    # put true positive code here 

彼らはより柔軟でより強力であるとあなたはまた、正規表現を使用することを好むことがあります。たとえば、これを実装した後でさえ、予期しないいくつかの理由で誤検出や偽陰性が残っていることに気付くかもしれません。 REは、新しい問題にすばやく適応することができます。

一方、パフォーマンスが主な懸念事項である場合は、そのような強力で柔軟性のないものを使用しない方がよい場合があります。そのため、アルゴリズムを自分の特定の要件に合わせてできるだけ効率的に実行できます。

+0

他のすべてのものに関係なく、大きなリストにはひどい検索時間があるので、 'FIRST_NAMES'はリストではなくセットであることを確認してください。 – DyZ

+0

私はそれについてのノートを追加します:) – Apollys

+0

これをよく見て、大きな画像で作業すると更新されます。これもありがとうございます! – newreadia

0

私が抱えている現在の問題は、姓でもある都市名から偽陽性を除去する方法を考え出すことです。ですから、例えば、私はカウントしたい、ジャクソンミシシッピは言うが、固有表現認識「「あなたは持っている問題が呼ばれているなど...

」、そして最良の解決された「フランク・ジャクソン」」ジェーン・ジャクソンをカウントしません複数のキューを考慮して名前付きエンティティを見つけ出し、タイプ(人、組織、場所など、または同様のリスト)に従って分類する分類器を使用します。

Chapter 7 nltkの本では、特にsection 3, Developing and evaluating chunkersが、レコグナイザーの構築とトレーニングのプロセスを説明しています。あるいは、Stanford名前付きエンティティ認識プログラムをインストールし、データのパフォーマンスを測定することもできます。

+0

私もこれを見て、これで何ができるかを見ていきます。これに頭をお寄せいただきありがとうございます! – newreadia

関連する問題