Извлечение частотных данных из отсортированного списка фраз - PullRequest
5 голосов
/ 03 октября 2011

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

У меня есть отсортированный списокобщих трехсловных фраз (триграмм), которые появляются в большом текстовом массиве информации, сгенерированном командами Mathematica Partition [], Tally [] и Sort [].Пример данных, над которыми я работаю (у меня есть сотни таких файлов):

{{{ва, ва, ва}, 66}, {{я, любовь,ты}, 62}, {{ля, ля, ля}, 50}, {{значение, жизни}, 42}, {давай, давай}, 40}, {{давай, давай},40}, {{да, да, да}, 38}, {{нет, нет, нет}, 36}, {{мы, ре, собираемся}, 36}, {{ты, любовь, я}, 35}, {{in, love, with}, 32}, {{the way you}, 30}, {{i, want to to}, 30}, {{back to to me}, 29}, <<38211 >>, {{of, an, xke}, 1}}

Я надеюсь найти этот файл, чтобы, если входное значение «смысл, жизни», вернулось"42."Я чувствую, что, должно быть, упускаю из виду что-то очевидное, но, повозившись, я наткнулся на кирпичную стену здесь.Mathematica в своей документации многозначна, что неудивительно.

Ответы [ 4 ]

6 голосов
/ 03 октября 2011

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

trigrams = {{{"wa", "wa", "wa"}, 66}, {{"i", "love", "you"}, 62}, 
 {{"la", "la", "la"}, 50}, {{"meaning", "of", "life"}, 42}, 
 {{"on", "come", "on"}, 40}, {{"come", "on", "come"}, 40}, 
 {{"yeah", "yeah", "yeah"}, 38}, {{"no", "no", "no"}, 36}, 
 {{"we", "re", "gonna"}, 36}, {{"you", "love", "me"}, 35}, 
 {{"in", "love", "with"}, 32}, {{"the", "way", "you"}, 30}, 
 {{"i", "want", "to"}, 30}, {{"back", "to", "me"}, 29}, 
 {{"of", "an", "xke"}, 1}};

Вот один из возможных способов создания хеш-таблицы:

Clear[trigramHash];
(trigramHash[Sequence @@ #1] = #2) & @@@ trigrams;

Теперь мы используем его как

In[16]:= trigramHash["meaning","of","life"]
Out[16]= 42

Этот подход будет полезен, если вы, конечно, выполняете много запросов.

EDIT

Если у вас много файлов и вы хотите эффективно выполнять их поиск в Mathematica, вы могли бы использовать вышеупомянутый механизм хеширования для преобразования всех ваших файлов в .mx двоичные файлы Mathematica. Эти файлы оптимизированы для быстрой загрузки и служат механизмом сохранения для определений, которые вы хотите сохранить. Вот как это может работать:

In[20]:= DumpSave["C:\\Temp\\trigrams.mx",trigramHash]
Out[20]= {trigramHash}

In[21]:= Quit[]

In[1]:= Get["C:\\Temp\\trigrams.mx"]
In[2]:= trigramHash["meaning","of","life"]
Out[2]= 42

Вы используете DumpSave для создания файла .mx. Итак, предлагаемая процедура состоит в том, чтобы загрузить ваши данные в Mathematica, файл за файлом, создать хэши (вы можете использовать SubValues для индексации конкретной хеш-таблицы с индексом вашего файла), а затем сохранить эти определения в .mx файлы. Таким образом, вы получаете быструю загрузку и быстрый поиск, и у вас есть свобода выбора, какую часть ваших данных сохранять в Mathematica в любой момент времени (практически без снижения производительности, обычно связанного с загрузкой файлов).

5 голосов
/ 03 октября 2011

Это один из способов добавить отдельные слова в вашей строке в список.

In[262]:= str = "meaning, of, life"; ReadList[
 StringToStream[str], Word, WordSeparators -> {",", " "}]

Out[262]= {"meaning", "of", "life"}

Вы можете использовать это в поисках случаев или в другой форме, чтобы получить результат 42 (очень подозрительно, эта цифра ...)

--- редактировать ---

Под «поиском» я имею в виду механизм, показанный Леонидом Шифриным. Я был неуверен относительно того, была ли в этом сложность, или просто преобразование строк в списки триад. Я (только) показываю способ управления последним.

--- конец редактирования ---

--- редактировать 2 ---

Комментарий показывает способы избежать ReadList. Позвольте мне заявить, что я в восторге, мне удалось найти этот подход. Ниже приведен код, который я поместил в свой исходный ответ, а затем заменил, когда понял, что существует более лаконичный код.

str = "meaning, of, life";
commaposns = StringPosition[str, ", "];
substrposns = 
  Partition[
   Join[{1}, 
    Riffle[commaposns[[All, 1]] - 1, commaposns[[All, 2]] + 1], {-1}],
    2];
substrs = Map[StringTake[str, #] &, substrposns]

Out[259]= {"meaning", "of", "life"}

Итог (почти буквально): я могу найти извилистые подходы так же, как и любой другой, и лучше, чем большинство.

--- конец редактирования ---

Даниэль Лихтблау

5 голосов
/ 03 октября 2011

Возможно, это не так быстро, как решение, которое дал Леонид, но вы можете просто превратить свой список пар в список правил.

In[1]:= trigrams = {{{"wa", "wa", "wa"}, 66}, {{"i", "love", "you"}, 
    62}, {{"la", "la", "la"}, 50}, {{"meaning", "of", "life"}, 
    42}, {{"on", "come", "on"}, 40}, {{"come", "on", "come"}, 
    40}, {{"yeah", "yeah", "yeah"}, 38}, {{"no", "no", "no"}, 
    36}, {{"we", "re", "gonna"}, 36}, {{"you", "love", "me"}, 
    35}, {{"in", "love", "with"}, 32}, {{"the", "way", "you"}, 
    30}, {{"i", "want", "to"}, 30}, {{"back", "to", "me"}, 
    29}, {{"of", "an", "xke"}, 1}};

In[2]:= trigramRules = Rule @@@ trigrams;

Который (если хотите) вы можете свернутьв функции, которая похожа на поведение Леонида

In[3]:= trigram[seq__String] := {seq} /. trigramRules

In[4]:= trigram["meaning", "of", "life"]

Out[4]= 42

Поскольку у вас очень большой список пар, применение сгенерированных правил может быть ускорено с помощью Dispatch.То есть делайте все остальное так же, как указано выше, за исключением определения trigramRules с использованием

trigramRules = Dispatch[Rule @@@ trigrams]
1 голос
/ 19 октября 2017

Довольно старый вопрос .. но теперь у нас есть Association

lookup = Association[Rule @@@ trigrams];
lookup[{"come", "on", "come"}]

40

или даже

lookup = Association[
   Rule[StringJoin@Riffle[#1, " "], #2] & @@@ trigrams]

lookup["meaning of life"]

42

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...