Сделайте расширение, которое будет переставлять слова местами?

Автор Рыбка Рио, 6 июля 2010, 20:54

0 Пользователи и 1 гость просматривают эту тему.

Рыбка Рио

Расширение, которое должно использовать особенность, которая заключается в том что от перемены слов местами смысл не меняется. К примеру,

Египетский парламент состоит из 454 мест.

превращается в, к примеру,
Из 454 мест парламент состоит египетский.

(переставляются слова между знаками препинания ; предлоги и частицы, видимо, объединяются со следующим за ними словом, а союзы - со знаком препинания)
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

Кстати,
Поддержки Ru.OpenOffice.org форум пользователей.
Форум Ru.OpenOffice.org поддержки пользователей.
Ru.OpenOffice.org форум пользователей поддержки.
и т.д.

Всего 24 варианта написания одного и того же предложения.

Кстати, точка не всегда является знаком препинания, а иногда бывает частью слова, как например в слове вести.рф или openoffice.org.
ubuntu 12.04 + LibO3.6.0

convas

Это в принципе невозможно, т.к. расширение не понимает смысла фразы.

Пример:

Мать любит дочь.
Дочь любит мать.

Кто кого любит?

JohnSUN

Экспертом, работоспособность проверяющим расширения, мастер Йода выбран будет
;D
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

smaharbA

#4
почему так ты подаван говоришь ?

опаздал :(
Я конечно далек от мысли... (с)

Syzygy

Расширение, с помощью которого можно переставлять слова местами существует и находится здесь. Как только будет разработан ИИ, в него сразу же будет добавлена возможность автоматической перестановки слов.
A Matter of Life and Death

Yakov

Есть ещё расширение, которое можно научить этому.
Только зачем?
Upd:
А вот  и пример ИИ:
http://en.wikipedia.org/wiki/Link_grammar    ::)

Yakov

А если нужна программа, которая это умеет делать относительно осмысленно для русского языка - зайдите на сайт
http://www.aot.ru/download.php. Программа называется ShortRML  - рабочее место лингвиста.

Рыбка Рио

Цитата: convas от  6 июля 2010, 21:12
Это в принципе невозможно, т.к. расширение не понимает смысла фразы.

Пример:

Мать любит дочь.
Дочь любит мать.

Кто кого любит?

Просто формы этих слов (мать и дочь) в винительном и именительном падежах совпадают. Поэтому их можно заменить: мать любит дочу. Тогда дочу любит мать, мать дочу любит. А так мать дочь любит, дочь мать любит - не понятно, что тут подлежащее, а что дополнение.

Именно из-за того, что в языке есть падежи порядок слов не имеет значения. А вот кстати, в языках, где формы слов совпадают, нельзя менять порядок. К примеру support forum не равно forum support. Зато форум поддержки = поддержки форум.
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

Цитата: Yakov от  6 июля 2010, 21:43Есть ещё расширение, которое можно научить этому.
Только зачем?
Чтобы по-другому взглянуть на текст (и к примеру увидеть недостатки). К примеру, в предложении мышь любит сыр есть явный недостаток, которого сразу не видно, т.к. непонятно, кто кого любит. У нас в языке дополнение может находится перед глаголом, так вот в этом предложении непонятно, что является дополнением, а что подлежащим, остаётся только догадываться, что вряд ли сыр любит мышу.
ubuntu 12.04 + LibO3.6.0

dr.Faust

Цитата: Крио от  6 июля 2010, 22:13Именно из-за того, что в языке есть падежи порядок слов не имеет значения. А вот кстати, в языках, где формы слов совпадают, нельзя менять порядок. К примеру support forum не равно forum support. Зато форум поддержки = поддержки форум.
В английском формы слов не всегда совпадают, так что иногда можно попереставлять... но вы правы - редко. Такие языки называются аналитическими. Есть языки изолированные - там действительно такое не возмжно. Китайский например. Но не все аналитические языки изолированные, хотя все изолированные - аналитические.
Русский язык синтетический, флективный - упражняйтесь :)
Ещё арабы и турки рады наверное будут...
Свобода информации - свобода личности!

smaharbA

Я конечно далек от мысли... (с)

Рыбка Рио

Вот вариант макроса, который меняет порядок слов в выделенном тексте. Например, исходный текст:
ЦитироватьПросто́е число́ — это натуральное число, которое имеет ровно два различных натуральных делителя: единицу и самого себя. Все остальные числа, кроме единицы, называются составными. Таким образом, все натуральные числа большие единицы разбиваются на простые и составные. Изучением свойств простых чисел занимается теория чисел. В теории колец простым числам соответствуют неприводимые элементы.
Результат (случайный):
ЦитироватьПросто́е число́ — это число натуральное, которое различных натуральных делителя имеет имеет ровно: и и себя единицу. числа остальные Все, кроме единицы, составными называются. Таким образом, большие на составные числа разбиваются и на простые и все. теория чисел Изучением свойств простых чисел занимается. В теории колец простым числам соответствуют неприводимые элементы.

Sub Main
Dim St1 As String
Doc=ThisComponent
SD=Doc.createSearchDescriptor
SD.SearchRegularExpression=TRUE
SD.SearchString=(",|;|-|–|\.|!|?|:|""|«|»|"|"|\'|\(|\)|...|—")

os=Doc.CurrentSelection
W1=Doc.WordCount
o1=os.Count-1
Dim aTK(W1,o1) As Object, znak1(W1) As Object, k1(o1) As Long

For i=0 to o1
        If len(os(i).String)=0 then goto Next_i
        TK1=Doc.Text.CreateTextCursorByRange(os(i).Start)
        TK2=Doc.Text.CreateTextCursorByRange(os(i).End)
        znak1(i)=Doc.findNext(TK1, SD)
        aTK(0,i)=TK1
        aTK(0,i).gotoRange(znak1(i).Start, TRUE)
        Do
            If Doc.Text.compareRegionEnds(znak1(i), TK2)<0 then Exit Do
         k1(i)=k1(i)+1
            aTK(k1(i),i)=Doc.Text.CreateTextCursorByRange(znak1(i).End)
            znak1(i)=Doc.findNext(znak1(i).End, SD)
            If IsNull(znak1(i)) then Exit Do
         aTK(k1(i),i).gotoRange(znak1(i).Start, TRUE)
        Loop
Next_i:
Next

aP4()=Array("без","в","во","до","за",_
"из","к","на","не","ни","о","от","по",_
"при","с","со","у")

aS1()=Array("а","и","но","поэтому","потому",_
"как","который","когда","что", "чтобы","которая",_
"которое","чего")

Pr1()=Array(101, 103, 107, 109, 113, 127, 131, 137, 139, 149)
p4=Pr1(Int(10*rnd))

SD.SearchRegularExpression=TRUE
SD.SearchString=("[:alnum:]+")

Dim n1 As Integer
Dim aTKn(3000) As Object
Dim stn(3000) As String

For i=0 to o1
For k=0 to k1(i)
If len(aTK(k,i).String)=0 then goto Next_k
      n1=0
        TK1=Doc.Text.CreateTextCursorByRange(aTK(k,i).Start)
        TK2=Doc.Text.CreateTextCursorByRange(aTK(k,i).End)
        znak2=Doc.findNext(TK1, SD)
        aTKn(0)=znak2
        stn(0)=znak2.String
        Do
            If Doc.Text.compareRegionEnds(znak2, TK2)<0 then Exit Do
         n1=n1+1
            znak2=Doc.findNext(znak2.End, SD)
            If IsNull(znak2) then Exit Do
         aTKn(n1)=znak2
         stn(n1)=znak2.String
        Loop
      
      p5=Int(n1*rnd)
      
      For m=0 to n1-1
         For k2=0 to Ubound(aP4)
            If aTKn(m).String=aP4(k2) then m=m+1 : stn(m)="" : goto Nextm
         Next
         For k2=0 to Ubound(aS1)
            If aTKn(m).String=aS1(k2) then stn(m)="" : goto Nextm
         Next
         m2=(p5+p4*m) mod n1
         Do
            If stn(m2)<>"" then exit do
            m2=(m2+p4) mod n1
         Loop
         aTKn(m).String=stn(m2)
      Nextm:
      Next
Next_k:
Next
Next

End Sub
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

Сразу вижу ошибки в макросе. Слова повторяются, не учитывается союз и.
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

Нет, всё-таки, по-моему, лучше не учитывать предлоги, частицы и союзы, т.к. там слишком много всего и сложно всё учесть. Всё равно потом руками текст подправлять нужно будет.

Итак, исходный текст:
ЦитироватьПросто́е число́ — это натуральное число, которое имеет ровно два различных натуральных делителя: единицу и самого себя. Все остальные числа, кроме единицы, называются составными. Таким образом, все натуральные числа большие единицы разбиваются на простые и составные. Изучением свойств простых чисел занимается теория чисел. В теории колец простым числам соответствуют неприводимые элементы.
Результат (случайный):
ЦитироватьПросто́е число́ — число натуральное это, два которое различных имеет натуральных ровно делителя: самого себя единицу и. числа остальные Все, единицы кроме, составными называются. Таким образом, числа составные на большие все простые единицы натуральные и разбиваются. Изучением занимается свойств теория простых чисел чисел. колец простым числам соответствуют неприводимые элементы В теории.

Макрос:

Sub Main
Doc=ThisComponent
SD=Doc.createSearchDescriptor
SD.SearchRegularExpression=TRUE
SD.SearchString=(",|;|-|–|\.|!|?|:|""|«|»|"|"|\'|\(|\)|...|—")

os=Doc.CurrentSelection
W1=Doc.WordCount
o1=os.Count-1
Dim aTK(W1,o1) As Object, znak1(W1) As Object, k1(o1) As Long

For i=0 to o1
   If len(os(i).String)=0 then goto Next_i
   TK1=Doc.Text.CreateTextCursorByRange(os(i).Start)
   TK2=Doc.Text.CreateTextCursorByRange(os(i).End)
   znak1(i)=Doc.findNext(TK1, SD)
   aTK(0,i)=TK1
   aTK(0,i).gotoRange(znak1(i).Start, TRUE)
   Do
      If Doc.Text.compareRegionEnds(znak1(i), TK2)<0 then Exit Do
      k1(i)=k1(i)+1
      aTK(k1(i),i)=Doc.Text.CreateTextCursorByRange(znak1(i).End)
      znak1(i)=Doc.findNext(znak1(i).End, SD)
      If IsNull(znak1(i)) then Exit Do
      aTK(k1(i),i).gotoRange(znak1(i).Start, TRUE)
   Loop
Next_i:
Next

Pr1()=Array(101, 103, 107, 109, 113, 127, 131, 137, 139, 149)
p4=Pr1(Int(10*rnd))

SD.SearchString=("[:alnum:]+")

Dim n1 As Integer
Dim aTKn(3000) As Object
Dim stn(3000) As String

For i=0 to o1
   For k=0 to k1(i)
      If len(aTK(k,i).String)=0 then goto Next_k
         n1=0
         TK1=Doc.Text.CreateTextCursorByRange(aTK(k,i).Start)
         TK2=Doc.Text.CreateTextCursorByRange(aTK(k,i).End)
         znak2=Doc.findNext(TK1, SD)
         aTKn(0)=znak2
         stn(0)=znak2.String
         Do
            If Doc.Text.compareRegionEnds(znak2, TK2)<0 then Exit Do
            n1=n1+1
            znak2=Doc.findNext(znak2.End, SD)
            If IsNull(znak2) then Exit Do
            aTKn(n1)=znak2
            stn(n1)=znak2.String
         Loop
      
         p5=Int(n1*rnd)
      
         For m=0 to n1-1
            aTKn(m).String=stn((p5+p4*m) mod n1)
         Next
   Next_k:
   Next
Next

End Sub
ubuntu 12.04 + LibO3.6.0