Вам будет нужно не один, но несколько хороших алгоритмов, вроде следующего.
я сожалею, я знаю, что Вы сказали, что хотели к KISS, но к сожалению, Вашим требованиям не настолько легко удовлетворить. Тем не менее, там существуйте инструменты для все это, и необходимо быть в состоянии просто связать их и не иметь для выполнения любой задачи сами, если Вы не хотите. Если Вы хотите выполнить задачу сами, я предлагаю, чтобы Вы посмотрели на стемминг, это является самым легким из всех.
, Если Вы идете с Java, объединение Lucene с инструментарий OpenNLP . Вы получите очень хорошие результаты, поскольку Lucene уже встроили стеммер и много учебного руководства. Инструментарий OpenNLP, с другой стороны, плохо документируется, но Вам не будет нужно слишком много из него. Вы могли бы также интересоваться NLTK, записанный в Python.
я сказал бы, что Вы отбрасываете свое последнее требование, поскольку оно включает поверхностный синтаксический анализ, и будет определенно не impove свои результаты.
А-ч, btw. точный термин того document-term-frequency-thing, который Вы искали, называют tf-idf. Это - в значительной степени лучший способ искать частоту документа для условий. Чтобы сделать это правильно, Вы не обойдете использование multidimenional векторные матрицы.
... Да, я знаю. После взятия семинара по IR мое уважение к Google было еще больше. После выполнения некоторого материала в IR мое уважение к ним упало столь же быстрое, все же.
\newcommand{\example}[2][YYY]{Mandatory arg: #2;
Optional arg: #1.}
This defines \example to be a command with two arguments,
referred to as #1 and #2 in the {<definition>}--nothing new so far.
But by adding a second optional argument to this \newcommand
(the [YYY]) the first argument (#1) of the newly defined
command \example is made optional with its default value being YYY.
Thus the usage of \example is either:
\example{BBB}
which prints:
Mandatory arg: BBB; Optional arg: YYY.
or:
\example[XXX]{AAA}
which prints:
Mandatory arg: AAA; Optional arg: XXX.
Общая идея создания «необязательных аргументов» состоит в том, чтобы сначала определить промежуточную команду, которая просматривает вперед, чтобы определить, какие символы будут следующими в потоке токенов, а затем вставляет соответствующие макросы для обработки аргумент (ы), возникающий при необходимости. Это может быть довольно утомительно (хотя и несложно) при использовании общего программирования TeX. LaTeX's \ @ ifnextchar
весьма полезен для таких вещей.
Лучший ответ на ваш вопрос - использовать новый пакет xparse
. Он является частью пакета программирования LaTeX3 и содержит обширные возможности для определения команд с весьма произвольными необязательными аргументами.
В вашем примере у вас есть макрос \ sec
, который принимает один или два аргумента в скобках. Это может быть реализовано с использованием xparse
со следующим:
\documentclass{article} \usepackage{xparse} \begin{document} \DeclareDocumentCommand\sec{ m g }{% {#1% \IfNoValueF {#2} { and #2}% }% } (\sec{Hello}) (\sec{Hello}{Hi}) \end{document}
Аргумент {mg}
определяет аргументы \ sec
; m
означает «обязательный аргумент», а g
- «необязательный аргумент в скобках». \ IfNoValue (T) (F)
можно затем использовать для проверки, действительно ли присутствует второй аргумент. См. В документации другие разрешенные типы необязательных аргументов.
Все, что вам нужно, это следующее:
\makeatletter
\def\sec#1{\def\tempa{#1}\futurelet\next\sec@i}% Save first argument
\def\sec@i{\ifx\next\bgroup\expandafter\sec@ii\else\expandafter\sec@end\fi}%Check brace
\def\sec@ii#1{\section*{\tempa\ and #1}}%Two args
\def\sec@end{\section*{\tempa}}%Single args
\makeatother
\sec{Hello}
%Output: Hello
\sec{Hello}{Hi}
%Output: Hello and Hi
Вот моя попытка, хотя она не совсем соответствует вашим требованиям. Не полностью протестировано, поэтому будьте осторожны.
\newcount\seccount
\def\sec{%
\seccount0%
\let\go\secnext\go
}
\def\secnext#1{%
\def\last{#1}%
\futurelet\next\secparse
}
\def\secparse{%
\ifx\next\bgroup
\let\go\secparseii
\else
\let\go\seclast
\fi
\go
}
\def\secparseii#1{%
\ifnum\seccount>0, \fi
\advance\seccount1\relax
\last
\def\last{#1}%
\futurelet\next\secparse
}
\def\seclast{\ifnum\seccount>0{} and \fi\last}%
\sec{a}{b}{c}{d}{e}
% outputs "a, b, c, d and e"
\sec{a}
% outputs "a"
\sec{a}{b}
% outputs "a and b"