我有一组 latex 格式的输入段落。我想用它们创建一个词袋。
采取一组看起来像这样的人:
"Some guy did something with \emph{ yikes } $ \epsilon $"
我想输出一本字典:
{
"Some": 40,
...
"yikes": 10
"epsilon (or unicode for it)": 3
}
也就是说,我需要一本字典,其中的键集是所有段落中的单词/符号/方程组(为了简洁起见,我将调用所有这些单词)以及它们在所有段落中出现的次数。
从给定的单词的 k 有序元组开始,我需要为每个段落一个 k 数组,其中数组中的第 i 个元素表示该段落中第 i 个元组中单词的计数。
所以说(Some, dunk, yikes, epsilon)
会给我
[1, 0, 1, 1]
对于所述示例。
我已经尝试过使用词法分析器取出标记并直接处理标记。这很困难并且容易出错,更不用说速度很慢了。有没有更好的策略或工具可以做到这一点?
对于特殊字符,需要考虑一些极端情况:
G\""odel => Gödel
例如。我想保留这些。
此外,我想将所有方程式放在一起或将它们保留为一个单词。方程出现在 $ ... $ 符号之间。
最佳答案
如果我理解正确,您正在尝试执行以下操作:
将句子拆分为单词:
s = "Some guy did something with \emph{ yikes } \epsilon" words = s.split() print words
输出:
['Some', 'guy', 'did', 'something', 'with', '\\emph{', 'yikes', '}', '\\epsilon']
计算出现的次数:
from collections import Counter dictionary = Counter(words) print dictionary
输出:
Counter({'did': 1, '}': 1, '\\epsilon': 1, 'Some': 1, 'yikes': 1, 'something': 1, 'guy': 1, 'with': 1, '\\emph{': 1})
以单独的列表形式访问单词及其相应的数字:
print dictionary.keys() print dictionary.values()
输出:
['did', '}', '\\epsilon', 'Some', 'yikes', 'something', 'guy', 'with', '\\emph{'] [1, 1, 1, 1, 1, 1, 1, 1, 1]
请注意,我还没有处理任何单词。您可能想要去掉括号或反斜杠。但这可以通过使用 for 循环遍历字典(或列表)并单独处理每个条目来轻松完成。
<小时/>将 LaTeX 变音符号转换为 unicode 字符在某种程度上是一个全新的问题。有几个关于这个主题的 stackoverflow 问题和答案。也许您只需要在初始字符串中查找/替换它们:
s = s.replace('\\"o', unichr(252))
(请注意,根据您的命令行编码,您可能看不到 print s
中的变音符号。但它们不会丢失,可以使用 print repr(s)
显示>.)
要保留方程,您可以使用正则表达式分割字符串,而不是split
:
import re
print re.findall('\$.+\$|[\w]+', s)
输出:
['Some', 'guy', 'did', 'something', 'with', 'emph', 'yikes', '$ \\epsilon $']
请参阅my answer to another question类似的例子和更详细的解释。
关于machine-learning - 如何为 latex 字符串创建一个词袋?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26195681/