سؤال

أحاول معالجة العديد من النصوص بواسطة Regex و NLTK من Python -وهو في http://www.nltk.org/book-. أحاول إنشاء مولد نص عشوائي وأواجه مشكلة بسيطة. أولاً ، إليك تدفق الكود الخاص بي:

  1. أدخل جملة كمدخلات -يسمى سلسلة المشغل ، يتم تعيينه لمتغير-

  2. احصل على أطول كلمة في سلسلة الزناد

  3. ابحث في جميع قاعدة بيانات Gutenberg للمشروع عن الجمل التي تحتوي على هذه الكلمة -غير محددة من الأحرف الكبيرة -

  4. أعد أطول جملة لها الكلمة التي تحدثت عنها في الخطوة 3

  5. قم بإلحاق الجملة في الخطوة 1 و Step4 معًا

  6. قم بتعيين الجملة في الخطوة 4 باعتبارها الجملة الجديدة "المشغل" وكرر العملية. لاحظ أنني يجب أن أحصل على أطول كلمة في الجملة الثانية والاستمرار هكذا وما إلى ذلك

حتى الآن ، تمكنت من القيام بذلك مرة واحدة فقط. عندما أحاول الاحتفاظ بهذا للمتابعة ، يستمر البرنامج فقط في طباعة الجملة الأولى التي ينتجها البحث. يجب أن يبحث في الواقع عن أطول كلمة في هذه الجملة الجديدة والاستمرار في تطبيق تدفق الكود الخاص بي الموضح أعلاه.

فيما يلي الكود الخاص بي مع عينة الإدخال/الإخراج:

عينة المدخلات

"ثين من الكود"

عينة الإخراج

"Thane of Code Norway نفسه ، بأرقام رهيبة ، بمساعدة من هذا traytor الأكثر روعة ، Thane of Cawdor ، بدأ صراعًا فنيًا ، حتى أن عريس بيلونا ، المحمول في الإفساد ، واجهه مع Selfe - مقارنات ، نقطة ضد نقطة ، ربح arme arme arme ، كبح روح لويش: ولختتم ، سقط فيكتوري على VS "

الآن يجب أن يأخذ هذا بالفعل الجملة التي تبدأ بـ "النرويج نفسه ...." وابحث عن أطول كلمة فيها وافعل الخطوات أعلاه وما إلى ذلك ولكنها لا تفعل ذلك. أي اقتراحات؟ شكرًا.

import nltk

from nltk.corpus import gutenberg

triggerSentence = raw_input("Please enter the trigger sentence: ")#get input str

split_str = triggerSentence.split()#split the sentence into words

longestLength = 0

longestString = ""

montyPython = 1

while montyPython:

    #code to find the longest word in the trigger sentence input
    for piece in split_str:
        if len(piece) > longestLength:
            longestString = piece
            longestLength = len(piece)


    listOfSents = gutenberg.sents() #all sentences of gutenberg are assigned -list of list format-

    listOfWords = gutenberg.words()# all words in gutenberg books -list format-
    # I tip my hat to Mr.Alex Martelli for this part, which helps me find the longest sentence
    lt = longestString.lower() #this line tells you whether word list has the longest word in a case-insensitive way. 

    longestSentence = max((listOfWords for listOfWords in listOfSents if any(lt == word.lower() for word in listOfWords)), key = len)
    #get longest sentence -list format with every word of sentence being an actual element-

    longestSent=[longestSentence]

    for word in longestSent:#convert the list longestSentence to an actual string
        sstr = " ".join(word)
    print triggerSentence + " "+ sstr
    triggerSentence = sstr
هل كانت مفيدة؟

المحلول

إجابة السيد هانكين أكثر أناقة ، ولكن ما يلي أكثر تمشيا مع النهج الذي بدأت به:

import sys
import string
import nltk
from nltk.corpus import gutenberg

def longest_element(p):
    """return the first element of p which has the greatest len()"""
    max_len = 0
    elem = None
    for e in p:
        if len(e) > max_len:
            elem = e
            max_len = len(e)
    return elem

def downcase(p):
    """returns a list of words in p shifted to lower case"""
    return map(string.lower, p)


def unique_words():
    """it turns out unique_words was never referenced so this is here
       for pedagogy"""
    # there are 2.6 million words in the gutenburg corpus but only ~42k unique
    # ignoring case, let's pare that down a bit
    for word in gutenberg.words():
        words.add(word.lower())
    print 'gutenberg.words() has', len(words), 'unique caseless words'
    return words

print 'loading gutenburg corpus...'
sentences = []
for sentence in gutenberg.sents():
    sentences.append(downcase(sentence))

trigger = sys.argv[1:]
target = longest_element(trigger).lower()
last_target = None

while target != last_target:
    matched_sentences = []
    for sentence in sentences:
        if target in sentence:
            matched_sentences.append(sentence)

    print '===', target, 'matched', len(matched_sentences), 'sentences'
    longestSentence = longest_element(matched_sentences)
    print ' '.join(longestSentence)

    trigger = longestSentence
    last_target = target
    target = longest_element(trigger).lower()

بالنظر إلى جملة العينة الخاصة بك ، فإنه يصل إلى التثبيت في دورتين:

$ python nltkgut.py thane من الكود
تحميل غوتنبورغ كوربوس ...
=== Target Thane تطابق 24 جملة
بدأ النرويج نفسه ، بأرقام رهيبة ، بمساعدة من معظم traytor ، thane of Cawdor ، صراعًا فظيعًا ، حتى أن عريس بيلونا ، المحمول في إثبات ، واجهته بمقارنات - نقارين ، ونقطة ضد بوينتس. Arme ، كبح روحه Lauish: ولختتم ، سقط فيكتوري على VS
=== المستهدف العريس الجمل 1 جمل
بدأ النرويج نفسه ، بأرقام رهيبة ، بمساعدة من معظم traytor ، thane of Cawdor ، صراعًا فظيعًا ، حتى أن عريس بيلونا ، المحمول في إثبات ، واجهته بمقارنات - نقارين ، ونقطة ضد بوينتس. Arme ، كبح روحه Lauish: ولختتم ، سقط فيكتوري على VS

جزء من المشكلة مع الرد على المشكلة الأخيرة هو أنه فعل ما طلبته ، لكنك طرحت سؤالًا أكثر تحديدًا مما كنت تريد إجابة عليه. وهكذا ، تعثرت الاستجابة في بعض تعبيرات القائمة المعقدة التي لست متأكدًا من فهمك. أقترح أن تستفيد أكثر ليبرالية لبيانات الطباعة ولا تستورد التعليمات البرمجية إذا كنت لا تعرف ماذا تفعل. في حين أن إلغاء تعبيرات القائمة التي وجدتها (كما هو مذكور) أنك لم تستخدم قائمة Wordlist. الوظائف هي مساعدة أيضا.

نصائح أخرى

وماذا عن هذا؟

  1. تجد أطول كلمة في الزناد
  2. تجد أطول كلمة في أطول جملة تحتوي على كلمة موجودة في 1.
  3. كلمة 1. هي أطول كلمة من الجملة 2.

ماذا يحدث؟ تلميح: الجواب يبدأ بـ "Infinite". لتصحيح المشكلة ، يمكنك العثور على مجموعة من الكلمات في الحالة السفلية لتكون مفيدة.

راجع للشغل عندما تعتقد أن Montypython يصبح خطأ وينتهي البرنامج؟

بدلاً من البحث في المجموعة بأكملها في كل مرة ، قد يكون من الأسرع بناء خريطة واحدة من كلمة إلى أطول جملة تحتوي على تلك الكلمة. ها هي محاولتي (غير المختبرة) للقيام بذلك.

import collections
from nltk.corpus import gutenberg

def words_in(sentence):
    """Generate all words in the sentence (lower-cased)"""
    for word in sentence.split():
        word = word.strip('.,"\'-:;')
        if word:
            yield word.lower()

def make_sentence_map(books):
    """Construct a map from words to the longest sentence containing the word."""
    result = collections.defaultdict(str)
    for book in books:
        for sentence in book:
            for word in words_in(sentence):
                if len(sentence) > len(result[word]):
                    result[word] = sent
    return result

def generate_random_text(sentence, sentence_map):
    while True:
        yield sentence
        longest_word = max(words_in(sentence), key=len)
        sentence = sentence_map[longest_word]

sentence_map = make_sentence_map(gutenberg.sents())
for sentence in generate_random_text('Thane of code.', sentence_map): 
    print sentence

تقوم بتعيين "split_str" خارج الحلقة ، بحيث تحصل على القيمة الأصلية ثم يحتفظ بها. تحتاج إلى تعيينه في بداية الحلقة ، لذلك يتغير في كل مرة.

import nltk

from nltk.corpus import gutenberg

triggerSentence = raw_input("Please enter the trigger sentence: ")#get input str

longestLength = 0

longestString = ""

montyPython = 1

while montyPython:
    #so this is run every time through the loop
    split_str = triggerSentence.split()#split the sentence into words

    #code to find the longest word in the trigger sentence input
    for piece in split_str:
        if len(piece) > longestLength:
            longestString = piece
            longestLength = len(piece)


    listOfSents = gutenberg.sents() #all sentences of gutenberg are assigned -list of list format-

    listOfWords = gutenberg.words()# all words in gutenberg books -list format-
    # I tip my hat to Mr.Alex Martelli for this part, which helps me find the longest sentence
    lt = longestString.lower() #this line tells you whether word list has the longest word in a case-insensitive way. 

    longestSentence = max((listOfWords for listOfWords in listOfSents if any(lt == word.lower() for word in listOfWords)), key = len)
    #get longest sentence -list format with every word of sentence being an actual element-

    longestSent=[longestSentence]

    for word in longestSent:#convert the list longestSentence to an actual string
        sstr = " ".join(word)
    print triggerSentence + " "+ sstr
    triggerSentence = sstr
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top