2017-10-04 4 views
-1

私の単純なTwitterボット(Python/Twythonで)は、テキストファイルからツイートを1行ずつ送信します。これはリストの理解度を使って、(任意の長さの)行を140文字のセクションにチャンクし、Twitterのスレッドとしてそれらをtweetします(nbはosスレッドに関係しません)。Pythonの文字長と単語境界でテキストをチャンク

(現在のところ、文字数制限を280に引き上げていますが、問題は発生しません)。

十分理解していれば、理解はしばしば、ラインの中間語を分割しますが、それは不満足です。

これは、リスト内包表記である:

tweetlist = [ bigtweet[i:i+140] for i in range(0, len(bigtweet), 140) ] 

、ここでは、> 140文字の行です:

:この場合

John buttered the toast slowly, deliberately, in the bathroom, with a knife, at midnight. Five professors wrote six papers in March (quickly, under pressure, and inelegantly) 

、我々はこのような行分割で終わります

Five professors wrote six papers in March (quickly, under pressure, and inelegantly).  John buttered the toast slowly, deliberately, in the b 

athroom, with a knife, at midnight. 

140の制限の前に最も近いスペース文字で行を分割する方がよいでしょう。これは全体の文章にパース/分割(約ないであることを

Five professors wrote six papers in March (quickly, under pressure, and inelegantly). John buttered the toast slowly, deliberately, in the 

bathroom, with a knife, at midnight. 

注:

は、だから私の例のテキストでは、行が良く、この(「バスルーム」の前にスペースで分割)のようになりますここにはすでに役に立つスレッドがいくつかあります)。私が実際に使っているデータは、文の構造、句読点やスペースの点で一貫していないので、私が何をしていても「控えめな」分割があり、それらのうちの少数が完全に受け入れられるようになります。

私は、チャンクを実行する方法の1つは、各チャンクが空き文字で終了するかどうかをテストし、そうでない場合はチャンクをn文字分繰り返してチャンクを繰り返しチャンクする真のテスト。

私はおそらくそれをやりかけることができますが、別の方法があるかどうか疑問に思っていますか?

NB私はではありません。プログラマーです。私は、ここで見つけたコード例と私が追加したコードのビットとボブからボットを作りました。理解は別のSOメンバーによって示唆されましたが、私は一般的にコードを理解し、オリジナルのコードを自分で管理することができます。私がまだ理解していないのは、オブジェクト指向のメソッド/クラスです。 LinuxでPython 2.7を使用していますが、Python 3に簡単に移行できます。

答えて

0

スペースを使用してテキストを単語に分割してみてください。次に、max_tweetの長さに達するまで単語を数えます。スペースを使って一緒に単語を結合してください。これは、次のように簡単にPythonのジェネレータ機能を使用して行われます。

def get_tweet(text, max_tweet=140): 
    total = 0 
    start_index = 0 
    words = text.split(' ') 

    for index, word in enumerate(words): 
     if total + len(word) > max_tweet: 
      tweet = ' '.join(words[start_index : index]) 
      yield tweet 
      total = 0 
      start_index = index 

     total += len(word) + 1 

    if start_index != index: 
     tweet = ' '.join(words[start_index:]) 
     yield tweet 


text = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh." 

for tweet in get_tweet(text): 
    print len(tweet), tweet 

この例のテキストは以下のように分割されます:

137 Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et 
138 magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat 
134 massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis 
138 vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate 
139 eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat 
135 a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur 
139 ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet 
133 adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt 
138 tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed 
31 fringilla mauris sit amet nibh. 

注意をテキストには、スペースなしで長い140よりがある場合、これは失敗する可能性が。

get_tweet(text, 240)と呼ば:

237 Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque 
239 eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer 
233 tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus 
237 viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper 
240 libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet 
80 orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. 
0

をあなたは言葉にあなたのテキストを分割し、再び一緒にそれらを結合する必要があります

bigtweet = 'John buttered the toast slowly, deliberately, in the bathroom, with a knife, at midnight. Five professors wrote six papers in March (quickly, under pressure, and inelegantly)' 

def yield_tweets(words): 
    length, offset, tweet = 0, 0, [] 
    for word in words: 
     if (len(word) + length - offset - 1) >= 140: 
      yield ' '.join(tweet) 
      tweet = [] 
      offset = length 
     length += len(word) + 1 
     tweet.append(word) 
    yield ' '.join(tweet) 

for tweet in yield_tweets(bigtweet.split()): 
    print(tweet) 

出力:

John buttered the toast slowly, deliberately, in the bathroom, with a knife, at midnight. Five professors wrote six papers in March 
(quickly, under pressure, and inelegantly) 

アップデート:

lorem = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh." 
for tweet in yield_tweets(lorem.split()): 
    print(len(tweet),tweet) 

出力:

137 Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et 
138 magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat 
134 massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis 
138 vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate 
139 eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat 
135 a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur 
139 ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet 
133 adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt 
138 tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed 
31 fringilla mauris sit amet nibh. 
関連する問題