2017-12-11 9 views
1

私はちょうど仕事のためのデータセットモジュール外のデータでテキストチュートリアルを考えています。私はデータフレームからいくつかのテキストデータを取得し、これを作業用の文字列変数として格納しています。私はスペイシー少しで働いてきたし、私はこれがテキスチャはtextacy.doc.Docクラスからコーパスを作成できません

class 'spacy.tokens.doc.Doc 

だから私のことができるようにすべきであるが出力docオブジェクト

nlp = spacy.load('en') 
doc1 = nlp(txt) 
print(type(doc1)) 

を作成する標準的な方法を知っている

def mergeText(df): 
    content = '' 
    for i in df['textColumn']: 
     content += (i + '. ') 
    #print(content) 
    return content 


    txt = mergeText(df) 

文書が示すようにこのdocファイルからコーパスを生成する

corpus = textacy.corpus.Corpus('en', docs=doc1) 

しかし、私は私は私が同じようにtextacyオブジェクトを作成しようとしましたが、運

doc = textacy.Doc(txt) 
print(type(doc)) 

<class 'spacy.tokens.doc.Doc'> 

としている機能に

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-8-c6f568014162> in <module>() 
----> 1 corpus = textacy.corpus.Corpus('en', docs=doc1, metadatas=None) 

~/anaconda3/envs/nlp/lib/python3.6/site-packages/textacy/corpus.py in __init__(self, lang, texts, docs, metadatas) 
    156    else: 
    157     for doc in docs: 
--> 158      self.add_doc(doc) 
    159 
    160  def __repr__(self): 

~/anaconda3/envs/nlp/lib/python3.6/site-packages/textacy/corpus.py in add_doc(self, doc, metadata) 
    337    msg = '`doc` must be {}, not "{}"'.format(
    338     {Doc, SpacyDoc}, type(doc)) 
--> 339    raise ValueError(msg) 
    340 
    341  ################# 

ValueError: `doc` must be {<class 'textacy.doc.Doc'>, <class 'spacy.tokens.doc.Doc'>}, not "<class 'spacy.tokens.token.Token'>" 

を正しいタイプを渡しているにもかかわらず、このエラーを取得しますまた、それを生のテキストを渡すコーパスためのparamaterテキストを使用しようとしたが、これは

corpus[:10] 

[Doc(1 tokens; "D"), 
Doc(1 tokens; "e"), 
Doc(1 tokens; "a"), 
Doc(1 tokens; "r"), 
Doc(1 tokens; " "), 
Doc(1 tokens; "C"), 
Doc(1 tokens; "h"), 
Doc(1 tokens; "r"), 
Doc(1 tokens; "i"), 
Doc(1 tokens; "s")] 

この問題を解決する方法上の任意のアイデアを出力?

EDIT ドキュメントを取得するために多くの行を形成し、ここでコーパスにこれを渡すと、私は、各テキストのテキストが下に保存されているスレッド

chat1 = df[(df['chat_hash']=='121418-456986')] 

のために働いていたデータフレームであります「テキスト」列であり、必要に応じてスピーカー列を介してこれらのそれぞれをスピーカーにバインドすることができます。

現在、私はcapitol wordsの例を見ていますが、これをデータフレームを使用して分割する方法は完全にはわかりません。

records = cw.records(speaker_name={'Hillary Clinton', 'Barack Obama'}) 
text_stream, metadata_stream = textacy.fileio.split_record_fields(records, 'text') 
corpus = textacy.Corpus('en', texts=text_stream, metadatas=metadata_stream) 
corpus 

docsパラメータが反復可能に期待している、と反復可能の項目があることが

thread = df[(df['chat_hash']=='121418-456986')] 
text_stream, metadata_stream = textacy.fileio.split_record_fields(thread, 'text') 
corpus = textacy.Corpus('en', texts=text_stream, metadatas=metadata_stream) 
corpus 

答えて

1

チャットハッシュのためのフィルタであることを、この場合には、レコードを設定した場合だろう各種Docタイプ。単一のドキュメントを渡しています。これは、反復処理時にTokens - エラーが返されます。 doc=doc1パラメータをdoc=[doc1]に変更すると、コーパスを作成できるようになります。

これは単一文書を含むコーパスですが、これはあまり役に立ちません。一緒に連結するのではなく、DataFrameの各行にDocを作成することを意味しますか?

EDIT:DATAFRAME

への対処は、各チャットを文書にしたい場合は、それを行うのが1グループにあるデータフレームchat_hashによると、一緒にすべてのテキストをconcatonate。ハッシュによって

  • ソートを

    • ロードモデル(この場合はダミーのデータフレームを作成します):この中

      import pandas as pd 
      import spacy 
      import textacy 
      
      nlp = spacy.load('en') 
      
      df = pd.DataFrame([['Ken', 'aaaa', 1, 'This is a thing I said'], 
              ['Peachy', 'aaaa', 2, 'This was a response'], 
              ['Ken', 'aaaa', 3, 'I agree!'], 
              ['Ken', 'bbbb', 1, 'This is a thing I said'], 
              ['Peachy', 'bbbb', 2, 'You fool!']], columns=['speaker', 'chat_hash', 'sequence_number', 'text']) 
      
      chat_concat = (df 
             .sort_values(['chat_hash', 
                'sequence_number']) 
             .groupby('chat_hash')['text'] 
             .agg(lambda col: '\n'.join(col))) 
      
      docs = list(chat_concat.apply(lambda x: nlp(x))) 
      
      corpus = textacy.corpus.Corpus(nlp, docs=docs) 
      
      corpus 
      

      ので、手順は次のとおりです。そして、そのための各チャットやコーパスのための文書を作成しますチャットハッシュでグループ化し、すべてのテキストを一緒に結合する(私はテキスト間に新しい行を使用し、任意の区切り文字を使用できます)

    • 各テキストブロックに関数を適用するそれから文書を作成する
    • 前と同じようにコーパスを作成します。
  • +0

    私は複数の行であるスレッドで文章を処理しています。はい。だから私はそれに応じてデータを分割する必要があると仮定します。[capital words](http://textacy.readthedocs.io/en/stable/index.html) – PeachyDinosaur

    +0

    データフレームの行はどのようなものですか?それぞれがスレッドの文章かスレッドの各投稿ですか? –

    +0

    各行には「テキスト」列の会話があります。 – PeachyDinosaur

    関連する問題