Преобразование списка слов в список частоты, с которой эти слова появляются - PullRequest
3 голосов
/ 23 января 2012

Я проделал большую работу со множеством списков слов.

Пожалуйста, рассмотрите следующий мой вопрос:

docText={"settlement", "new", "beginnings", "wildwood", "settlement", "book",
"excerpt", "agnes", "leffler", "perry", "my", "mother", "junetta", 
"hally", "leffler", "brought", "my", "brother", "frank", "and", "me", 
"to", "edmonton", "from", "monmouth", "illinois", "mrs", "matilda", 
"groff", "accompanied", "us", "her", "husband", "joseph", "groff", 
"my", "father", "george", "leffler", "and", "my", "uncle", "andrew", 
"henderson", "were", "already", "in", "edmonton", "they", "came", 
"in", "1910", "we", "arrived", "july", "1", "1911", "the", "sun", 
"was", "shining", "when", "we", "arrived", "however", "it", "had", 
"been", "raining", "for", "days", "and", "it", "was", "very", 
"muddy", "especially", "around", "the", "cn", "train"}

searchWords={"the","for","my","and","me","and","we"}

Каждый из этих списков намного длиннее (скажем, 250 словв списке searchWords и docText около 12 000 слов).

Прямо сейчас у меня есть возможность выяснить частоту заданного слова, выполнив что-то вроде:

docFrequency=Sort[Tally[docText],#1[[2]]>#2[[2]]&];    
Flatten[Cases[docFrequency,{"settlement",_}]][[2]]

Но то, где я зацикливаюсь, находится в моем стремлении создать конкретные списки.,В частности, проблема преобразования списка слов в список частоты, с которой эти слова появляются.Я пытался сделать это с Do петлями, но ударил стену.

Я хочу пройти через docText с searchWords и заменить каждый элемент docText чистой частотой его появления.Т.е. поскольку «поселение» появляется дважды, оно будет заменено на 2 в списке, тогда как «мое» появляется 3 раза, оно станет 3. В этом случае список будет выглядеть примерно как 2,1,1,1,2, итак далее.

Я подозреваю, что ответ лежит где-то в If[] и Map[]?

Все это звучит странно, но я пытаюсь предварительно обработать кучу информации для получения информации о частоте терминов ...


Добавление для ясности (надеюсь):

Вот лучший пример.

searchWords={"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "A", "about", 
"above", "across", "after", "again", "against", "all", "almost", 
"alone", "along", "already", "also", "although", "always", "among", 
"an", "and", "another", "any", "anyone", "anything", "anywhere", 
"are", "around", "as", "at", "b", "B", "back", "be", "became", 
"because", "become", "becomes", "been", "before", "behind", "being", 
"between", "both", "but", "by", "c", "C", "can", "cannot", "could", 
"d", "D", "do", "done", "down", "during", "e", "E", "each", "either", 
"enough", "even", "ever", "every", "everyone", "everything", 
"everywhere", "f", "F", "few", "find", "first", "for", "four", 
"from", "full", "further", "g", "G", "get", "give", "go", "h", "H", 
"had", "has", "have", "he", "her", "here", "herself", "him", 
"himself", "his", "how", "however", "i", "I", "if", "in", "interest", 
"into", "is", "it", "its", "itself", "j", "J", "k", "K", "keep", "l", 
"L", "last", "least", "less", "m", "M", "made", "many", "may", "me", 
"might", "more", "most", "mostly", "much", "must", "my", "myself", 
"n", "N", "never", "next", "no", "nobody", "noone", "not", "nothing", 
"now", "nowhere", "o", "O", "of", "off", "often", "on", "once", 
"one", "only", "or", "other", "others", "our", "out", "over", "p", 
"P", "part", "per", "perhaps", "put", "q", "Q", "r", "R", "rather", 
"s", "S", "same", "see", "seem", "seemed", "seeming", "seems", 
"several", "she", "should", "show", "side", "since", "so", "some", 
"someone", "something", "somewhere", "still", "such", "t", "T", 
"take", "than", "that", "the", "their", "them", "then", "there", 
"therefore", "these", "they", "this", "those", "though", "three", 
"through", "thus", "to", "together", "too", "toward", "two", "u", 
"U", "under", "until", "up", "upon", "us", "v", "V", "very", "w", 
"W", "was", "we", "well", "were", "what", "when", "where", "whether", 
"which", "while", "who", "whole", "whose", "why", "will", "with", 
"within", "without", "would", "x", "X", "y", "Y", "yet", "you", 
"your", "yours", "z", "Z"}

Это автоматически сгенерированные стоп-слова изWordData[].Поэтому я хочу сравнить эти слова с docText.Так как «урегулирование» НЕ является частью searchWords, то оно будет выглядеть как 0. Но так как «my» является частью searchWords, оно будет отображаться как счетчик (так что я могу сказать, сколько раз данное слово появляется).

Я действительно благодарю вас за вашу помощь - я с нетерпением жду возможности пройти некоторые официальные курсы, как только я наткнусь на край моей способности действительно объяснить, что я хочу делать!

Ответы [ 3 ]

7 голосов
/ 23 января 2012

Мы можем заменить все, что не появляется в searchWords на 0 в docText, следующим образом:

preprocessedDocText = 
   Replace[docText, 
     Dispatch@Append[Thread[searchWords -> searchWords], _ -> 0], {1}]

Мы можем заменить оставшиеся слова по частоте:

replaceTable = Dispatch[Rule @@@ Tally[docText]];

preprocessedDocText /. replaceTable

Dispatch предварительно обрабатывает список правил (->) и значительно ускоряет замену при последующем использовании.

Я не сравнивал это с большими данными, но Dispatch должен обеспечить хорошее ускорение.

4 голосов
/ 23 января 2012

@ Сабольч дал прекрасное решение, и я, вероятно, сам пойду тем же путем. Вот немного другое решение, просто для удовольствия:

ClearAll[getFreqs];
getFreqs[docText_, searchWords_] :=
  Module[{dwords, dfreqs, inSearchWords, lset},
    SetAttributes[{lset, inSearchWords}, Listable];
    lset[args__] := Set[args];
    {dwords, dfreqs} = Transpose@Tally[docText];
    lset[inSearchWords[searchWords], True];
    inSearchWords[_] = False;
    dfreqs*Boole[inSearchWords[dwords]]]

Это показывает, как атрибут Listable может использоваться для замены циклов и даже Map -пинга. У нас есть:

In[120]:= getFreqs[docText,searchWords]
Out[120]= {0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,3,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,2,
1,0,0,2,0,0,1,0,2,0,2,0,1,1,2,1,1,0,1,0,1,0,0,1,0,0}
2 голосов
/ 25 января 2012

Я решил решить эту проблему не так, как Сабольч, но в итоге получилось нечто похожее.

Тем не менее, я думаю, что это чище. На некоторых данных это быстрее, на других медленнее.

docText /. 
  Dispatch[FilterRules[Rule @@@ Tally@docText, searchWords] ~Join~ {_String -> 0}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...